动态

详情 返回 返回

JavaWeb學習筆記03 - JSP - 动态 详情

JSP原理

瀏覽器向服務器發送請求,不管訪問什麼資源,其實都是在訪問Servlet

JSP 本質也是Servlet,實現了HttpServlet

  1. 判斷請求
  2. 內置對象(pageContext,session,application,config,out,page,request,response)
  3. 輸出頁面前增加的代碼
  4. 在JSP中,JAVA代碼會原封不動的輸出,HTML會被轉為out.write("<html>");的格式輸出

基礎語法

引入JSTL表達式依賴包javax.servlet.jsp.jstl 和standard標籤庫

<dependency>
  <groupId>javax.servlet.jsp.jstl</groupId>
  <artifactId>jstl-api</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>taglibs</groupId>
  <artifactId>standard</artifactId>
  <version>1.1.2</version>
</dependency>
表達式:<%= 變量或表達式 %>
用來將程序輸出到客户端
<%= new java.util.Date()%> //Tue Nov 23 21:19:01 CST 2021
腳本片段:<% java代碼 %>
<% out.println("test");%>
代碼嵌入HTML元素: ${}
<% for(int i=0;i<10;i++){%>
    <p>${i}</p>
<% }%>
聲明:<%! %>
JSP的聲明,會被編譯到JSP生成的類中;其他會生成到_jspService方法中
<%!
    static {
        System.out.println("test");
    }
%>
註釋:<%-- 註釋 --%>
<%-- JSP的註釋,不會在客户端顯示 --%>
指令:<%@ page %> <%@ include %>
<%@ page errorPage="error/500.jsp" %> //指定500頁面
標籤 <jsp:include />
<jsp:include page="/common/header.jsp"/>

<%@include %>和<jsp:include /> 的區別:1會合並頁面 2不會

內置對象

  • PageContext
  • Request
  • Response
  • Session
  • Application (ServletContext)
  • Config (ServletConfig)
  • out
  • page
  • Exception
<%
    pageContext.setAttribute("name1","Name1");//在一個頁面中有效
    request.setAttribute("name2","Name2");    //在一次請求中有效
    session.setAttribute("name3","Name3");    //在一次對話中有效
    application.setAttribute("name4","Name4");//在服務器一次開關中有效
%>
<%
    //從底層到高層(作用域):page > request > session > application
    //雙親委派機制:
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
%>
<h1>${name1}</h1>
<h2>${name2}</h2>
<h3>${name3}</h3>
<h4>${name4}</h4>

EL表達式

EL表達式:獲取數據,執行運算,獲取web開發的常用對象
<jsp:forward page="/test.jsp">
    <jsp:param name="name" value="xiaoma"/>
    <jsp:param name="phone" value="13511112222"/>
</jsp:forward>
EL表達式獲取參數:<%= request.getParameter("name")%>
EL表達式獲取表單數據:${param.參數名}

JSTL表達式

JSP標籤集貨,封裝了JSP應用的通用核心功能
  1. 引用核心標籤庫:

    <%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
  2. 常用標籤

    <%--判斷表單參數--%>
    <c:if test="${param.name} == 'admin'">
        <c:out value="登錄成功"></c:out>
    </c:if>
    
    <%--其他--%>
    <c:choose>
    <c:when>
    <c:set>
    <c:forEach var="item" items="${list}">

JavaBean

一般用來做數據庫字段做映射ORM(對象關係映射):表 -> 類,字段 -> 屬性,行記錄 -> 對象
  1. 必須有一個無參構造
  2. 屬性必須私有化
  3. 必須有對應的get/set方法
class People {
        private int id;
        private String name;
        private int age;
}

### 過濾器 Filter

  1. 過濾器中的代碼,在過濾特定請求時都會執行
  2. 必須要讓過濾器繼續通行

cn/itxiaoma/filter/TestFilter.java

package cn.itxiaoma.filter;
import javax.servlet.*;
import java.io.IOException;
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器開始");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("過濾器執行前...");
        chain.doFilter(request, response);//讓過濾器繼續執行
        System.out.println("過濾器執行後...");
    }
    @Override
    public void destroy() {
        System.out.println("過濾器銷燬");
    }
}

src/main/webapp/WEB-INF/web.xml

<filter>
  <filter-name>TestFilter</filter-name>
  <filter-class>cn.itxiaoma.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>TestFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

監聽器 Listener

public class TestListener implements HttpSessionListener {
    ...
}
<!--註冊監聽器-->
<listener>
  <listener-class>cn.itxiaoma.listener.TestListener</listener-class>
</listener>

Filter實現權限攔截

src/main/webapp/login.jsp

<form action="servlet/login" method="post">
    <input type="text" name="username"/>
    <input type="submit" value="Login">
</form>

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_4_0.xsd"
         version="4.0"
         metadata-complete="true">
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.itxiaoma.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/servlet/login</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>cn.itxiaoma.filter.SysFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/sys/*</url-pattern>
  </filter-mapping>
</web-app>

cn/itxiaoma/servlet/LoginServlet.java

package cn.itxiaoma.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
    //get和post只是請求實現的不同方式,業務邏輯一樣,因此可以互相調用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        if (username.equals("admin")) {
            req.getSession().setAttribute("USER_SESSION", req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");
        }else{
            resp.sendRedirect("/error.jsp");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

cn/itxiaoma/filter/SysFilter.java

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    if (req.getSession().getAttribute("USER_SESSION") == null) {
        resp.sendRedirect("/error.jsp");
    }
    chain.doFilter(request, response);
}

Add a new 评论

Some HTML is okay.