[Java Web] JSP

一、简述

JSP是一种动态网页技术标准,其本质就是Servlet。

JSP文件在用户第一次请求时会被编译成Servlet,之后再由该Servlet处理用户的请求。

二、基础

<!-- 声明 -->
<%!
    String scheme;
    String serverName;
    int serverPort;
%>

<!-- 代码段 -->
<%
    scheme = request.getScheme();
    serverName = request.getServerName();
    serverPort = request.getServerPort();
%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<%=scheme%><br/>
<%=serverName%><br/>
<%=serverPort%><br/>
<%=String.format("%s://%s:%d/", scheme, serverName, serverPort)%>
</body>
</html>
View Code

编译指令用于设计JSP程序的属性以及生成的Servlet的属性。

  • page指令用于设置JSP页面的属性和功能。
  • include将外部文件包含至此JSP页面中。
  • taglib允许使用用户自定义的标签。

动作是一组内置标签,用于控制JSP的行为。

  • <jsp:include>用于运行时包含文件。
  • <jsp:forward>用于重定向到其他页面。
  • <jsp:param>用于提供参数。
//index.jsp
<jsp:include page="result.jsp">
    <jsp:param name="number" value="100"/>
</jsp:include>

//result.jsp
<%
    String str = request.getParameter("number");
    int number = Integer.parseInt(str);
    int result = 0;
    while (number != 0) {
        result += number;
        number--;
    }
    out.print(result);
%>
View Code

JSP页面在执行时会出现两类异常:

  • JspError:JSP文件转换为Servlet时出现的编译错误。
  • JspException:处理请求时由于逻辑错误而出现的异常。

三、内置对象

内置对象简述:

  • request:javax.servlet.HttpServletRequest接口实现的对象,代表从客户端发送的请求,使用该对象可获取客户端的信息以及用户提交的数据。每次请求都会产生request实例。
  • respone:javax.servlet.HttpServletRespone接口实现的对象,用于响应客户端请求并向客户端输出信息。每次响应都会产生respone实例。
  • session:javax.servlet.HttpSession接口实现的对象,服务器为每个用户浏览器创建单独的session实例,在需要保存用户数据时服务端可将数据写入session中,用户端从session中读取。
  • application:java.servlet.ServletContext接口实现对象,用于在多用户之间保存数据,作用范围是从服务器开始运行到服务器关闭。
  • page:本质上是转换后的Servlet,可调用所有Servlet类所定义的方法。
  • pageContext:提供了获取其他内置对象的方法。
  • config:提供了获取服务器配置信息的方法。
  • exception:用于页面发生错误时做出相应处理。
//index.jsp
<form action="session.jsp" method="post">
    <table align="center">
        <tr>
            <td align="center">用户:</td>
            <td align="left">
                <input type="text" name="user"/>
            </td>
        </tr>
        <tr>
            <td align="center">密码:</td>
            <td align="left">
                <input type="password" name="pass"/>
            </td>
        </tr>
        <tr>
            <td align="center">
                <input type="submit" value="登陆"/>
            </td>
        </tr>
    </table>
</form>

//session.jsp
<%
    session.setMaxInactiveInterval(60);//最大有效时间
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    user = new String(user.getBytes("ISO-8859-1"), "UTF-8");//防止中文乱码
    pass = new String(pass.getBytes("ISO-8859-1"), "UTF-8");

    session.setAttribute("user", user);
    session.setAttribute("pass", pass);
    response.sendRedirect("message.jsp");
%>

//message.jsp
<%
    out.println("Session Id:" + session.getId());
    out.println("UserName:" + session.getAttribute("user"));
    out.println("Password:" + session.getAttribute("pass"));
%>
View Code

Http是一种无状态协议,只负责请求与响应而不对客户端进行区分。Session跟踪用于区分客户端,主要的方式如下

  • URL重写:在URL地址中添加数据用于标识session。即使用户关闭了Cookie也可以使用这种方式,但是因数据容易暴露而存在安全隐患。
  • 隐藏表单:服务器发送隐藏的HTML表单字段和唯一的session会话编号,以保持服务器对不同用户的追踪。用户查看网页源码时可隐藏字段的属性,存在安全漏洞。
  • Cookie:通过访问用户磁盘上的Cookie文件来识别用户,用户再次访问某个站点时服务器将要求浏览器查找并返回先前发送的Cookie信息。
  • HttpSession:Servlet提供了该接口,建立在URL重写和Cookie的基础上。Servlet可自动提供数据存储空间并关联session。

Cookie使用示例:

//index.jsp
<%
    String user = "";
    String pass = "";
    Cookie[] cookies = request.getCookies();
    for (int i = 0; cookies != null && i < cookies.length; i++) {
        if (cookies[i].getName().equals("testCookie")) {
            String[] strings = cookies[i].getValue().split("@");
            user = strings[0];
            pass = strings[1];
        }
    }
    if (user.isEmpty() || pass.isEmpty())
        out.print("Welcome guest");
    else out.print("Welcome " + user);
%>

//cookie.jsp
<%
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    user = new String(user.getBytes("ISO-8859-1"), "UTF-8");
    pass = new String(pass.getBytes("ISO-8859-1"), "UTF-8");

    Cookie cookie = new Cookie("testCookie", String.format("%s@%s", user, pass));
    response.addCookie(cookie);
%>
View Code

HttpSession使用示例:

//ServletSession
public class ServletSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        String message;
        int accessCount = 0;
        if (session.isNew()) {
            message = "Welcome here!";
        } else {
            message = "Welcome back!";
            Integer oldAccessCount = (Integer) session.getAttribute("accessCount");
            if (oldAccessCount != null)
                accessCount = oldAccessCount + 1;
        }
        session.setAttribute("accessCount", accessCount);

        String content = "<!DOCTYPE html>" +
                "<html>" +
                "<head>" + "<title>servlet session</title>" + "</head>" +
                "<body>" + message + "<br/>" +
                "会话编号:" + session.getId() + "<br/>" +
                "创建时间:" + session.getCreationTime() + "<br/>" +
                "最后访问:" + session.getLastAccessedTime() + "<br/>" +
                "</body>" +
                "</html>";
        out.println(content);
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
        <servlet-name>ServletSession</servlet-name>
        <servlet-class>ServletSession</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletSession</servlet-name>
        <url-pattern>/ServletSession</url-pattern>
    </servlet-mapping>
</web-app>
View Code

猜你喜欢

转载自www.cnblogs.com/arseneyao/p/9319878.html