1. 程式人生 > >[Java Web] JSP

[Java Web] JSP

建立 使用 set index dog form -name 包含 ride

一、簡述

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

[Java Web] JSP