JSP学习笔记(二)

2019-11-02  本文已影响0人  dev_winner

page指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令。

JSP的三大指令元素

<%@ page 属性1="属性值1" 属性2="属性值2" ...%>
<%-- 例如:--%>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>
属性 描述 默认值
language 指定JSP页面使用的脚本语言 java
import 通过该属性来引用脚本语言中使用到的类文件
contentType 用来指定JSP页面所采用的编码方式 text/html,ISO-8859-1(纯英文,不支持中文),charset的值一般为utf-8。pageEncoding是jsp文件本身的编码。contentType的charset是指服务器发给客户端时的内容编码

JSP注释

<!--html注释, 客户端可见--> 
<%-- jsp注释,客户端不可见 --%> 
<%
  // JSP脚本注释:单行注释
  /*
  多行注释
  服务器端的注释,客户端看不到
  */
  out.println("我是jsp页面中的java代码,我向浏览器输出一条信息!");
%>

JSP脚本

<%
  // Java代码
%>
测试注释

JSP声明

<%! Java代码 %>
<%-- 例如:--%>
<%!
  //在JSP页面中定义变量或者方法
  String str = "张三";
  int add(int a, int b) {
      return a + b;
  }
%>

JSP表达式

<%=表达式 %>
<%-- 注意:表达式不以分号结束,即不要在表达式后面添加分号 --%>
<%-- 例如使用上面JSP声明的变量和方法 --%>
你好,<%=str %>
<hr/>
x+y=<%=add(10, 3) %>
<hr/>

JSP页面的生命周期

JSP页面的生命周期
     <%!
        String printMultiTable1() {
            String str = "";
            for(int i = 1; i <= 9; ++i) {
                for(int j = 1; j <= i; ++j) {
                    str += i + "*" + j + "=" + (i * j) + "&nbsp;&nbsp;&nbsp;&nbsp;";
                }
                str += "<br/>";
            }
            return str;
        }

        //JSP内置out对象,使用脚本方式调用,打印九九乘法表
        void printMultiTable2(JspWriter out) throws IOException {
            for(int i = 1; i <= 9; ++i) {
                for(int j = 1; j <= i; ++j) {
                    out.println(i + "*" + j + "=" + (i * j) + "&nbsp;&nbsp;&nbsp;&nbsp;");
                }
                out.println("<br/>");
            }
        }
    %>
    <hr/>
    <h1>九九乘法表</h1>
    <%=printMultiTable1() %>
    <hr/>
    <!-- 通过脚本方式调用定义的方法,遵循java代码要求 -->
    <% printMultiTable2(out); %>
打印九九乘法表

include指令:将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。语法:<%@ include file="URL" %>

<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="java.util.Date"%>
<%
    Date d = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    String s = sdf.format(d);
    out.print(s);
%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
    <h1>Include指令和动作</h1>
    <hr>
    <!-- include指令 -->
    <%@ include file="date.jsp" %> 
    <hr>
    <!-- include动作 -->
    <jsp:include page="date.jsp" flush="false"/>
</body>
</html>
测试include指令和动作 include指令与include动作的区别

taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为。

JSP内置对象

  1. void println(); 向客户端(浏览器)打印字符串。
  2. void clear(); 清除缓冲区的内容,若其在flush()方法后被调用则会抛出异常
  3. void clearBuffer(); 清除缓冲区的内容,若其在flush()方法之后被调用则不会抛出异常
  4. void flush(); 将缓冲区内容输出到客户端(浏览器)。
  5. int getBufferSize(); 返回JSP页面缓冲区总字节数的大小
  6. int getRemaining(); 返回缓冲区还剩余多少可用。
  7. boolean isAutoFlush(); 返回缓冲区满时,是自动清空还是抛出异常。
  8. void close(); 关闭输出流。
  <%
    out.flush();
    //clear()方法不能在flush()方法后使用,会抛出异常
    //out.clear();
    out.clearBuffer();//而使用clearBuffer()方法则不会抛出异常
  %>
    缓冲区的大小:<%=out.getBufferSize() %>byte<br/>
    缓冲区剩余大小:<%=out.getRemaining() %>byte<br/>
    是否自动清空缓冲区:<%=out.isAutoFlush() %><br/>
    <h1>用户登录表单</h1>
    <%--不推荐使用get方式提交表单,因为url中包含要提交的数据,建议使用post方式提交表单--%>
    <form action="doLogin.jsp" name="loginForm" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" /></td>
            </tr>
            <tr>
            <td>密码:</td>
                <td><input type="password" name="password" /></td>
            </tr>
            <tr>
            <%--colspan 属性规定单元格可横跨的列数--%>
            <td colspan="2"><input type="submit" value="登录" /></td>
            </tr>
        </table>
    </form>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>响应登录结果</title>
</head>
<body>
    <h1>欢迎您,登录成功!</h1>
</body>
</html>
  1. String getParameter(String name) : 返回name 指定参数的参数值
  2. String[] getParameterValues(String name): 返回包含参数name的所有值的数组
  3. void setAttribute(String, Object): 存储此请求中的属性
  4. object getAttribute(String name): 返回指定属性的属性值(键值对)
  5. String getContentType(): 得到请求体的MIME类型
  6. String getProtocol(): 返回请求用的协议类型及版本号
  7. String getServerName(): 返回接收请求的服务器主机名
  8. int getServerPort(): 返回服务器接收此请求所用的端口号
  9. String getCharacterEncoding(): 返回字符编码方式
  10. void setCharacterEncoding(): 设置请求的字符编码方式
  11. int getContentLength(): 返回请求体的长度(以字节数)
  12. String getRemoteAddr(): 返回发送此请求的客户端IP地址
  13. String getRealPath(String path): 返回某个文件的真实路径
  14. String request.getContextPath(): 返回上下文路径
    <h1>用户注册</h1>
    <form action="request.jsp" name="regForm" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" /></td>
            </tr>
            <tr>
                <td>爱好:</td>
                <td>
                    <input type="checkbox" name="favorite" value="read">读书
                    <input type="checkbox" name="favorite" value="music">音乐
                    <input type="checkbox" name="favorite" value="movie">电影
                    <input type="checkbox" name="favorite" value="internet">上网
                </td>
            </tr>
            <tr>
                <%--colspan 属性规定单元格可横跨的列数--%>
                <td colspan="2"><input type="submit" value="登录" /></td>
            </tr>
        </table>
    </form>
    <%--URL传递中文需要更改tomcat配置文件server.xml:即添加URIEncoding="utf-8"
           若不更改配置文件,则使用post/get请求就可以避免中文乱码
         <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8"/>
    --%>
    <a href="request.jsp?username=李四">测试URL传递参数</a>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <title>注册信息测试页面</title>
</head>
<body>
    <h1>request内置对象</h1>
    <%
        //在接收数据的页面中解决中文乱码问题:设置当前页面与提交表单页面的字符集一致,但是其无法解决URL参数传递中文出现的乱码问题
        request.setCharacterEncoding("utf-8");
        //设置属性值
        request.setAttribute("password", "123456");
    %>
    用户名:<%=request.getParameter("username") %> <br/>
    爱好:<%
        String[] favorites = request.getParameterValues("favorite");
        if(favorites != null) {
            for (int i = 0; i < favorites.length; ++i) {
                out.println(favorites[i] + "&nbsp;&nbsp;");
            }
        }
    %>
    <br/>
    密码:<%=request.getAttribute("password") %><br/>
    请求体的MIME类型:<%=request.getContentType() %><br/>
    协议类型及版本号:<%=request.getProtocol() %><br/>
    服务器主机名:<%=request.getServerName() %><br/>
    服务器端口号:<%=request.getServerPort() %><br/>
    请求文件的长度:<%=request.getContentLength() %><br/>
    请求客户端的IP地址:<%=request.getRemoteAddr() %><br/>
    请求的真实路径:<%=request.getRealPath("request.jsp") %><br/>
    请求的上下文路径(虚拟访问路径):<%=request.getContextPath() %><br/>
</body>
</html>
表单填写 测试request对象中的方法
  1. String getCharacterEncoding(): 返回响应用的是何种字符编码
  2. void setContentType(String type): 设置响应的MIME类型
  3. PrintWriter getWriter(): 返回可以向客户端输出字符的一个对象(注意比较:PrintWriter与内置对象out的区别)
  4. sendRedirect(java.lang.String location): 重新定向客户端的请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.PrintWriter" %>
<%
    //设置响应的MIME类型
    response.setContentType("text/html;charset=utf-8");
    out.println("<h1>response内置对象</h1>");
    out.println("<hr/>");
    //PrintWriter对象的执行要比内置对象out提前,若要实现out先输出,则需要强制清空缓冲区,将缓冲区的内容刷新到浏览器页面中
    //out.flush();

    //获得输出流对象
    PrintWriter outer = response.getWriter();
    outer.println("大家好,我是response对象生成的输出流outer对象");
    //请求重定向,注意使用之前要把前面的out.flush();代码注释掉,否则会抛出异常
    //response.sendRedirect("request.jsp");
    request.getRequestDispatcher("request.jsp").forward(request, response);
%>

请求转发与请求重定向

  1. long getCreationTime(): 返回SESSION对象的创建时间,单位是毫秒
  2. public String getId(): 返回SESSION创建时JSP引擎为它设置的唯一ID号
  3. public Object setAttribute(String name, Object value): 使用指定名称将对象绑定到此会话
  4. public Object getAttribute(String name): 返回与此会话中的指定名称绑定在一起的对象,若没有对象绑定在该名称下,则返回null
  5. String[] getValueNames(): 返回一个包含此SESSION中所有可用属性的数组
  6. int getMaxInactiveInterval(): 返回两次请求间隔多长时间此SESSION被取消(单位:秒)
  7. void setMaxInactiveInterval(): 设置当前session的最大生存期限(单位:秒)
    <h1>session内置对象</h1>
    <%
      SimpleDateFormat sdft = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
      Date d = new Date(session.getCreationTime());
      session.setAttribute("pwd", "admin");
      session.setAttribute("user", "张三");
      session.setAttribute("age", 20);

      //设置当前session的最大生存期限,单位:秒
      session.setMaxInactiveInterval(10); //10秒钟

    %>
    Session对象的创建时间:<%=sdft.format(d) %><br/>
    Session的ID编号:<%=session.getId() %><br/>
    从Session对象中获取密码:<%=session.getAttribute("pwd") %><br/>
    <a href="doLogin.jsp" target="_blank">跳转到新的页面来测试是否为同一个session</a>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>响应登录结果</title>
</head>
<body>
    <h1>欢迎您,登录成功!</h1>

    <h1>Session内置对象</h1>
    Session的ID编号:<%=session.getId() %><br/>
    从Session对象中获取密码:<%=session.getAttribute("pwd") %><br/>
    Session对象中保存的属性有:<%
        String[] names = session.getValueNames();
        for (String name : names) {
            out.println(name + "&nbsp;&nbsp;");
        }
    %><br/>
</body>
</html>
测试session对象

Session的生命周期

<!--设置会话一分钟后过期,单位:分钟-->
<session-config>
    <session-timeout>1</session-timeout>
</session-config>
  1. public void setAttribute(String name, Object value): 使用指定名称将对象绑定到此会话。
  2. public Object getAttribute(String name): 返回与此会话中的指定名称绑定在一起的对象,若没有对象绑定在该名称下,则返回null。
  3. Enumeration getAttributeNames(): 返回所有可用属性名的枚举。
  4. String getServerInfo(): 返回JSP(SERVLET)引擎名及版本号。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Enumeration" %>
<html>
<head>
    <title>application内置对象</title>
</head>
<body>
     <%
        application.setAttribute("city", "北京");
        application.setAttribute("postcode", "10000");
        application.setAttribute("email", "lisi@qq.com");
     %>
     所在的城市是:<%=application.getAttribute("city") %><br/>
     application对象中的属性有:<%
         Enumeration attributes = application.getAttributeNames();
         while(attributes.hasMoreElements()) {
             out.print(attributes.nextElement() + "<br/>");
         }
     %><br/>
     JSP(SERVLET)引擎名及版本号:<%=application.getServerInfo() %><br/>
</body>
</html>
application内置对象的使用
  1. class getClass():返回此Object的类
  2. int hasCode():返回此Object的hash码
  3. boolean equals(Object obj):判断此Object是否与指定的Object对象相等
  4. void copy(Object obj):把此Object拷贝到指定的Object对象中
  5. Object clone():克隆此Object对象
  6. String toString():把此Object对象转换成String类的对象
  7. void notify():唤醒一个等待的进程
  8. void notifyAll():唤醒所有等待的进程
  9. void wait(int timeout):使一个线程处于等待直到timeout结束或被唤醒
  10. void wait():使一个线程处于等待直到被唤醒
  1. JspWriter getOut():返回当前客户端响应被使用的JspWriter流(out)
  2. HttpSession getSession():返回当前页中的HttpSession对象(session)
  3. Object getPage():返回当前页面的Object对象(page)
  4. ServletRequest getRequest():返回当前页面的ServletRequest对象(request)
  5. ServletResponse getResponse():返回当前页面的ServletResponse对象(response)
  6. void setAttribute(String name, Object attribute):设置属性及属性值
  7. Object getAttribute(String name, int scope):在指定范围内取属性的值
  8. int getAttributeScope(String name):返回某属性的作用范围
  9. void forward(String relativeUrlPath):使当前页面重导到另一页面
  10. void include(String relativeUrlPath):在当前位置包含另一文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    String s = sdf.format(date);
    out.println(s + "<br/>");
%>
<html>
<head>
    <title>测试包含jsp文件的页面</title>
</head>
<body>
    我是include.jsp文件,我被包含了!
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext内置对象</title>
</head>
<body>
    <h1>测试pageContext内置对象</h1>
    密码是:<%=pageContext.getSession().getAttribute("pwd") %>
    <hr/>
    日期为:
    <%
        // 跳转到注册界面
        // pageContext.forward("request.jsp");
        // 包含include.jsp文件
        pageContext.include("include.jsp");
    %>
</body>
</html>
pageContext对象的使用
  1. ServletContext getServletContext():返回含有服务器相关信息的ServletContext对象
  2. String getInitParameter(String name):返回初始化参数的值
  3. Enumeration getInitParameterNames():返回Servlet初始化所需所有参数的枚举
  1. String getMessage():返回描述异常的信息
  2. String toString():返回关于异常的简短描述信息
  3. void printStackTrace():显示异常及其栈轨迹
  4. Throwable FillInStackTrace():重写异常的执行栈轨迹
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="exception2.jsp" %>
<%-- 指定抛出的异常让exception2.jsp文件去处理  --%>
<html>
<head>
    <title>测试异常</title>
</head>
<body>
    <h1>测试异常exception</h1>
    <%
        // 抛出运行时算数异常
        System.out.println(100/0);
    %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<%--当前页面要处理异常,则必须将isErrorPage属性设置为true--%>
<html>
<head>
    <title>测试exception内置对象</title>
</head>
<body>
    <h1>exception内置对象</h1>
    异常消息是:<%=exception.getMessage() %><br/>
    异常的字符串描述:<%=exception.toString() %>
</body>
</html>
使用exception内置对象
上一篇 下一篇

猜你喜欢

热点阅读