JSP 原理
浏览器向服务器发送申请,不论拜访什么资源,其实都是在拜访 Servlet
JSP 实质也是 Servlet,实现了 HttpServlet
- 判断申请
- 内置对象(pageContext,session,application,config,out,page,request,response)
- 输入页背后减少的代码
- 在 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 利用的通用外围性能
-
援用外围标签库:
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
-
罕用标签
<%-- 判断表单参数 --%> <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(对象关系映射):表 -> 类,字段 -> 属性,行记录 -> 对象
- 必须有一个无参结构
- 属性必须私有化
- 必须有对应的 get/set 办法
class People {
private int id;
private String name;
private int age;
}
### 过滤器 Filter
- 过滤器中的代码,在过滤特定申请时都会执行
- 必须要让过滤器持续通行
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);
}