jsp+servlet 复习(C03)

    xiaoxiao2023-10-05  152

    C03_D01_UseJsp1 calculate.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>计算结果</title> </head> <body> <br> <% double a=Double.parseDouble(request.getParameter("num1")); double b=Double.parseDouble(request.getParameter("num2")); double result=a/b; %> <h1 style="color: green;">计算结果:<%=result%> </h1> </body> </html>

    C03_D02_UseJsp2 CalculateServlet

    package com.qdu.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/cs") public class CalculateServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 获取请求参数 double num1=Double.parseDouble(req.getParameter("num1")); double num2=Double.parseDouble(req.getParameter("num2")); //2. 调用业务逻辑 double result=num1/num2; //3. 显示响应 //如果servlet产生了一些数据,需要共享给下个组件(servlet或jsp) //可以考虑将数据放入请求对象,然后转发请求即可 req.setAttribute("jieguo", result); //获取请求转发器,指定转发目标是result.jsp,调用forward转发当前请求对象和响应对象 req.getRequestDispatcher("/result.jsp").forward(req, resp); } }

    result.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>计算结果</title> </head> <body> <h1 style="color:red;">计算结果: ${jieguo} </h1> </body> </html>

    test.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测运用JSP页面</title> </head> <body> <h1>测运用JSP页面!!!</h1> <hr> <% int a=10; int b=20; int c=a+b; %> <p>哈哈哈</p> <% for(int i=0;i<10;i++) out.println("<br>呵呵呵"); %> <p>嘎嘎嘎</p> <hr> <p>呵呵呵呵呵呵呵呵呵呵呵呵和</p> </body> </html>

    style.css

    h1{ text-align: center; color: lightcoral; } table{ border-spacing: 20px; } input{ padding: 5px 10px; outline: none; border-radius: 5px; border: solid lightblue 1px; } input[type="submit"]{ background-color: darkcyan; border: none; color: white; } input[type="submit"]:hover{ background-color: brown; cursor: pointer; } p{ color: darkgreen; }

    C03_D03_UseJsp3 index.jsp

    <!DOCTYPE html> <html> <head> <title>首页</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="css/style.css"/> </head> <body> <h1>JSP页面组件</h1> <hr> <ul> <li><a href="jsp指令.jsp">jsp指令</a></li> <li><a href="jsp脚本元素.jsp?name=anna">jsp脚本元素</a></li> <!--传递一个参数下一个jsp页面用--> <li><a href="jsp隐式对象.jsp?name=anna">jsp隐式对象</a></li> <!--传递一个参数下一个jsp页面用--> <li><a href="jsp动作.jsp?name=anna">jsp动作</a></li> <!--传递一个参数下一个jsp页面用--> </ul> </body> </html>

    <%-- 主题: jsp指令 这是JSP注释,客户端看不见 --%> <!--taglib用于引入一个标记库,uri指定该标记库的名称,prefix用于指定标记库的别名(随便起),我们用别名使用标记库中的标记--> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page import="java.text.SimpleDateFormat"%> <%@page import="java.util.Random"%> <%@page import="java.util.Date"%> <!--这是html注释,客户端可以看见,通过查看网页源代码就可以查看--> <%--<%@page 指令属性名="指令的属性值" ..... %>--%> <%@page contentType="text/html" pageEncoding="UTF-8" %> <!--可以使用page指令多次,用于定义不同的属性--> <%@page language="java" %> <!--如果还没有会话对象,去访问一个session属性设置为true的jsp页面,会导致创建一个会话对象--> <%@page session="true" %> <!--buffer用于设置响应的缓冲区大小,autoFlush设置是否自动清空缓冲区,清空缓冲区导致缓冲区内容输出到客户端--> <%@page buffer="8kb" autoFlush="true" %> <!--isThreadSafe属性用于设置转换成的servlet应用的线程模型,true表示多线程模型,false表示单线程模型--> <%@page isThreadSafe="true" %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP指令</title> <script src="js/jquery-3.3.1.min.js"></script> <script src="js/script.js"></script> <link rel="stylesheet" href="css/style2.css"/> </head> <body> <h1>jsp指令</h1> <hr> <div class="container"> <h3>1. page指令</h3> <div class="brown content"> <h4>* page指令用于设置需要通知给web容器的信息,也就是页面的一些全局信息</h4> <h4>* page指令的属性:</h4> <div class="inner-content"> *(1) contentType:设置页面的响应内容的MIME类型,也就是内容类型<br> *(2) pageEncoding:页面编码,设置页面的响应内容的编码<br> *(3) language: 语言,指定页面的脚本语言,jsp一般使用java<br> *(4) import: 导入使用的java类,导包<br> *(5) extends: 指定当前jsp转成的servlet继承的父类的全限定类名<br> *(6) session: 指定在当前页面是否获取会话对象,默认是true,获取会话对象<br>     如果设置为false,则不能在页面上使用session这个隐式对象<br>     如果访问当前jsp的时候,还没有会话,而且session属性设置为true,则会创建会话<br> *(7) isThreadSafe: 是否是线程安全的,true是使用多线程模型,false是使用单线程模型,默认值是true<br> </div> </div> <% Date riqi=new Date(); Random rand=new Random(); //SimpleDateFormat提供一些方法格式化日期的格式 SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E"); String now=sdf.format(riqi); //按照指定的格式格式化日期,以字符串形式返回结果 %> <p>日期:<%=now%></p> <h3>2. taglib指令</h3> <h4 class="brown content">* taglib指令用于引入使用的标记库</h4> <% for(int i=1;i<=5;i++) out.println("<p>哈哈哈</p>"); %> <c:forEach begin="1" end="6"> <p style="color:red;">呵呵呵呵呵呵</p> <hr> </c:forEach> <h3>3. include指令</h3> <h4 class="brown content">* include指令用于将其他页面包含到当前页面中,file指定要包含的页面</h4> <%@include file="menu.html" %> </div> <br> <!-- Ajax: 一种技术,用于实现页面的局部刷新 这里调用jQuery提供的ajax函数发送了一个ajax请求给url为logout的Servlet 请求结束会话, 这里点击超链接执行js,所以不会刷新页面 --> <a class="logout" href="javascript:$.ajax('logout');">结束会话</a> </body> </html>

    jsp脚本元素.jsp

    <%-- 主题: jsp脚本元素 --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP脚本元素</title> <link rel="stylesheet" href="css/style.css"/> </head> <body> <h1>JSP脚本元素</h1> <hr> <div class="container"> <!--JSP脚本元素用于在jsp页面嵌入java代码--> <h3>1. java代码段(也就是scriptlet)</h3> <!--<p class="strong">***在页面上编写的java代码段和java表达式的内容都会被封装到转成的servlet的_jspService()方法中</p>--> <% int a=10; int b=20; int c=a+b; %> <% for(int i=0;i<5;i++){ out.println("<p>姑娘,你好!</p>"); } %> <% for(int i=0;i<5;i++){ %> <p style="color:red;">呵呵</p> <% } %> <hr> <h3>2. java表达式,用于直接将值插入到输出中,后面不要加分号,后面不要加分号,后面不要加分号</h3> <!--<p>表达式中可使用:*1.变量 *2.调用一个方法(方法需要有返回值) *3.常规表达式 如1+1</p>--> <p>使用变量:<%=a%></p> <p>调用方法,方法需要有返回值:<%=Math.ceil(10.5)%></p> <p>常规表达式:<%=1+1%></p> <hr> <h3>3. java声明:用于声明全局变量和类中方法</h3> <p class="strong">***隐式对象只能在java代码段和java表达式中使用,在java声明中不可以使用隐式对象,因为隐式对象都是在_jspService()方法中定义的,而java代码段和java表达式的内容会封装到_jspService()方法中,所以可以使用隐式对象。</p> <%! int x=100; public void sayHi(){ System.out.println("Hi"); } %> </div> </body> </html>

    <%-- 主题: jsp隐式对象 --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP隐式对象</title> <link rel="stylesheet" href="css/style.css"/> </head> <body> <h1>JSP隐式对象</h1> <hr> <div class="container"> <h3>隐式对象:是一些特定的预定义的变量,可在JSP页面上(jsp代码段和jsp表达式)直接使用</h3> <p>1. request: 请求对象,封装发来的请求信息</p> <p>2. response: 响应对象,包含响应信息</p> <p>3. out: 用于在页面动态输出内容的对象</p> <p>4. application: 当前应用程序的ServletContext对象 </p> <p>5. page: 当前页面对象</p> <p>6. session: 当前的会话对象,通过getSession()获取的</p> <p>7. config : jsp转成servlet后对应的ServletConfig对象</p> <p>8. pageContext: 当前页面的上下文对象,可用于存储页面范围数据,也可用于获取其他隐式对象或对页面做一些操作,如请求转发</p> <p>9. exception: 异常对象,只有错误页面可以用,也就是isErrorPage属性设为true的页面</p> <hr> <!--为了在不同范围共享数据,我们提供了一些不同域范围--> <!--如果想在四个范围共享数据,调用域对象的setAttribute()方法以名称-值对的形式放入对应的域对象即可--> <h3>四个域对象: application>session>request>pageContext </h3> <p> <br>application: 应用程序范围,将数据放入application对象(就是上下文对象) <br>session: 会话范围,将数据放入session对象(就是会话对象) <br>request: 请求范围,将数据放入request对象(就是请求对象) <br>page: 页面范围,将数据放入pageContext对象(就是页面上下文对象) </p> <br> <p style="color: darkslategrey;">A. 可使用java表达式获取域对象中的属性</p> <p> <br>页面范围属性: <br>请求范围属性: <br>会话范围属性: <br>程序范围属性: </p> <p style="color: darkslategrey;">B. 也可使用EL表达式获取域对象中的属性</p> <p> <br>页面范围属性: <br>请求范围属性: <br>会话范围属性: <br>程序范围属性: </p> </div> </body> </html>

    <%-- 主题: jsp动作(jsp action) --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP动作</title> <link rel="stylesheet" href="css/style.css"/> </head> <body> <h1>JSP动作</h1> <hr> <div class="container"> <h3>JSP动作:JSP动作用于执行一些特殊任务,如使用javabean,转发请求等</h3> <p>请求参数:<%=request.getParameter("name")%></p> <% //A调用forward转发请求给B,A和B都是处理同一个请求,最后显示B的内容 //A调用include转发请求给B,A和B都是处理同一个请求,最后显示A+B的内容,将B的内容包含到A中一起显示 %> <%--使用jsp动作语法--%> <p>用于从当前页面foward方式转发请求给指定的页面</p> <p>用于从当前页面include方式转发请求给指定的页面</p> </div> </body> </html>

    LogoutSerlvet

    package com.qdu.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/logout") public class LogoutSerlvet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如果有会话,结束会话 HttpSession session = req.getSession(false); if (session != null) { session.invalidate(); } } }

    MySessionListener

    package com.qdu.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @WebListener //等效于在web.xml中注册监听器 public class MySessionListener implements HttpSessionListener{ @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("Session创建............."+se.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("Session摧毁.............."+se.getSession().getId()); } }

    h1{ text-align: center; color: lightcoral; } ul{ list-style: none; padding: 0; } a{ display: block; width: 200px; height: 40px; line-height: 40px; margin: 30px auto; background-color: darkcyan; color: white; text-align: center; text-decoration: none; } a:hover{ text-decoration: underline; background-color: brown; } .container{ padding: 30px; background-color: lightgoldenrodyellow; } .container h3{ color: darkcyan; } .container p{ color: brown; padding-left: 23px; } .strong{ color: brown;font-style: italic;font-weight: bold; }

    body{ font-family: 微软雅黑; } .brown{ color:brown; } .strong{ font-weight: bold; color: darkcyan; } p{ padding-left: 20px; } .content{ padding-left:30px; } .inner-content{ padding-left: 60px; color: darkgreen; } h4{ margin:5px; } .logout{ background-color: darkcyan; text-decoration: none; border-radius: 5px; padding: 7px 10px; color: white; position: fixed; top: 40px; right: 120px; } .logout:hover{ background-color: brown; text-decoration: underline; }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <jsp-config> <jsp-property-group> <description>设置html页面的编码,如果发现html出乱码了,使用该设置</description> <display-name>htmlEncoding</display-name> <url-pattern>*.html</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config> </web-app>

    C03_D04_Jsp_ErrorPage

    <!--可以为单个jsp页面指定错误页面--> <%@page errorPage="errorPage.jsp" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>计算</title> </head> <body> <% int num1=Integer.parseInt(request.getParameter("num1")); int num2=Integer.parseInt(request.getParameter("num2")); int result=num1/num2; %> <h1>计算结果:<%=result%></h1> </body> </html>

    <!--作为错误页面的页面需要将page指令的isErrorPage属性设置为true,这样可以在该页面获取错误和异常信息--> <%@page isErrorPage="true" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误页面</title> <link rel="stylesheet" href="css/style.css"/> </head> <body> <h1 class="warning">错误页面-程序出现了异常!</h1> <hr> <% //如果页面B是A的错误页面,那么当A发生异常的时候 //会自动传一个异常对象给到B,包含异常信息 //exception隐式对象只能在错误页面使用,该对象包含异常信息 out.println("<br>异常类型:"+exception.getClass()); out.println("<br>异常消息:"+exception.getMessage()); out.println("<br>异常对象:"+exception); %> <br> <br> <hr> <% //获取更多错误信息,从pageContext对象中获取ErrorData对象 //如果要获取更多错误信息,如错误代码等信息,获取ErrorData对象 ErrorData ed=pageContext.getErrorData(); //用于获取页面信息和其他对象 out.println("<br>请求的URI:"+ed.getRequestURI()); out.println("<br>状态代码:"+ed.getStatusCode()); out.println("<br>异常对象:"+ed.getThrowable()); %> <br> <br> <hr> </body> </html>

    最新回复(0)