文章目录
JavaWebDay02
7.JSP
7.1什么JSP
Java Server Pages:java服务器端页面,也和Servlet一样,用于开发动态web
最大的特点:
- 写JSP就像在写HTMl
- 区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入java代码,为用户提供动态数据;
7.2JSP原理
思路:JSP到底怎么执行的!
-
代码层面没有任何问题
-
服务器内部工作
Tomcat中有一个work目录;
IDEA中使用Tomcat会在IDEA的Tomcat中产生一个work目录
浏览器向服务器发送请求,不管访问什么资源,其实就是在访问servlet!
JSP最终也会被转化为一个java类!
JSP本质就是一个Servlet !
public void _jspInit() { };//初始化
protected void _jspDestroy() {};//销毁
public abstract void _jspService(HttpServletRequest var1, HttpServletResponse var2){};//JSP服务
1.判断请求
2.内置一些对象
final jakarta.servlet.jsp.PageContext pageContext; //页面上下文
jakarta.servlet.http.HttpSession session=null;
final jakarta.servlet.ServletContext application;
final jakarta.servlet.ServletConfig config;
jakarta.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
HttpServletRequest request;
HttpServletResponse response;
3.输出页面前增加的代码
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;
4.以上的这些对象我们可以在JSP页面直接使用,在jsp中只要是java代码,都会原封不动的输出,而HTML代码会通过out.write()输出
7.3JSP基础语法
JSP语法在Java的基础上扩充了一些语法;同时支持所有的java语法
JSP表达式
<%--jsp表达式
作用:将程序的输出,输出到客户端
<%=变量名或者表达式%>
--%>
<%=new Date()%>
JSP脚本片段
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 1; i < 101; i++) {
sum += i;
}
out.print("<h1>sum=" + sum + "<h1>");
%>
JSP声明
<%!java代码段%> <%--此Java代码段在生成servlet的时候放在了类中,不是service方法中,<%%>中的代码段才是放在_jspService方法中--%>
7.4JSP指令、标签
<%@ page ...%>
<%--include指令会将多个页面合成一个,所以多个页面中的变量不能重名--%>
<%@include file=""%>
<%--include标签则是拼接页面,本质还是多个,只要保证单个页面中变量不要重名就行了--%>
<jsp:include page=""/>
7.5 、9大内置对象
- PageContext
只能在当前页面使用
- Request
客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
- Response
- Session
客户端向服务器发送请求,产生的数据,用户用完,一会还有用,比如:购物车;
- Application [ServletContext]
客户端向服务器发送请求,产生的数据,一个用户用完,其他用户还可能使用,比如:聊天数据;
- config [ServletConfig]
- out
- page 不用了解
- exeception
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("name1","cjp1"); //保存的数据只在一个页面中有效
request.setAttribute("name2","cjp2"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cjp3"); //再一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cjp4"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%
//通过pageContext取出我们保存的值
String name1 = (String)pageContext.findAttribute("name1");
String name2 = (String)pageContext.findAttribute("name2");
String name3 = (String)pageContext.findAttribute("name3");
String name4 = (String)pageContext.findAttribute("name4");
String name5 = (String)pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>
当从另一个页面取这五个值时:只有name3和name4能取到
7.6、JSP标签、JSTL标签、EL表达式
EL表达式: ${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
调用java方法
JSP标签
//页面转发时设置参数
<jsp:forward page="forward2.jsp">
<jsp:param name="name" value="曹久平"/>
<jsp:param name="age" value="21"/>
</jsp:forward>
//获取参数
名字:<%=request.getParameter("name")%><br>
年龄:<%=request.getParameter("age")%>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样!
使用前需要两个依赖:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
- 核心标签(掌握部分)
- 格式化标签
- SQL标签
- xml标签
c:if
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello</h1>
<form action="coreif.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<c:if test="${param.username =='cjp'}" var="Iscjp">
<c:out value="欢迎您!"/>
</c:if>
<c:out value="${Iscjp}"/>
</body>
</html>
c:choose、c:when
<c:set var="score" value="89"/>
<c:choose>
<c:when test="${score>=90}">
优秀
</c:when>
<c:when test="${score>=80}">
良好
</c:when>
<c:when test="${score>=70}">
一般
</c:when>
<c:when test="${score>=60}">
及格
</c:when>
</c:choose>
c:foreach
<%
ArrayList<String> person = new ArrayList<>();
person.add(0,"张三");
person.add(1,"李四");
person.add(2,"王伍");
person.add(3,"赵六");
person.add(4,"田七");
request.setAttribute("list",person)
%>
<c:forEach var="person" items="${list}">
<c:out value="${person}"/> <br>
</c:forEach>
8.JavaBean
实体类
Javabean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set;
一般用来和数据库的字段做映射ORM;
ORM:对象关系映射
- 数据库中的表对应java的一个类
- 字段对应属性
- 行记录–>类的对象
9、MVC三层架构
Model View Controller
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0t6ibxOL-1649487857769)(C:\Temp\1649226479120.png)]
- 早些年,用户直接通过访问控制层来直接操作数据库;
servlet--->CRUD--->数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
三层架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0pYgIFH-1649487857771)(C:\Temp\1649227304548.png)]
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
view
- 展示数据
- 提供来连接发起servlet请求(a,form,img…)
Controller
- 接收用户的请求:(request;请求参数、session信息…)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录->接收用户登录请求->处理用户的请求(获取用户登录参数 Username、password)->交给业务层处理登录业务(判断用户名、密码是否正确;事务)->Dao层查询数据库验证用户名或者密码是否正确->数据库
10.Filter(重点)
过滤器:用来过滤网站的数据
- 处理中文乱码
- 登录验证
Filter开发步骤:
-
导包
-
编写过滤器
(1)导包不要错
import jakarta.servlet.*;
public class CharacterEncodingFilter implements Filter { //初始化:web服务器启动,他就初始化了,随时等待过滤对象 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter已初始化!"); } //Chain:链 /* * 1.过滤中的所有代码,在过滤特定请求的时候都会执行 * 2.必须要让过滤器继续通行 * chain.doFilter(request,response); * */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-16"); response.setCharacterEncoding("utf-16"); response.setContentType("text/html;charset=UTF-16"); System.out.println("CharacterEncodingFilter执行前。,。"); chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序就只能执行到这里 System.out.println("CharacterEncodingFilter执行后。,。"); } //销毁:web服务器关闭的时候销毁 public void destroy() { System.out.println("CharacterEncodingFilter已销毁!"); } }
web.xml中配置:
<filter> <filter-name>filter1</filter-name> <filter class>com.cjp.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <!-- 只要是/servlet的任何请求,都会经过这个过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
11.监听器(listener)
实现一个监听器的接口(有N种)
回顾:session销毁的方式:
一、自动销毁
<session-config>
<session-timeout>10</session-timeout>
</session-config>
二、手动销毁
<%session.invalidate();%>
- 编写监听器(统计session个数)
package com.cjp.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext con =se.getSession().getServletContext();
Integer onlineCount = (Integer) con.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount=new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount=new Integer(count+1);
}
con.setAttribute("OnlineCount",onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext con =se.getSession().getServletContext();
Integer onlineCount = (Integer) con.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount=new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount=new Integer(count-1);
}
con.setAttribute("OnlineCount",onlineCount);
}
}
- 在web.xml中注册监听器
<listener>
<listener-class>com.cjp.listener.SessionListener</listener-class>
</listener>
12.过滤器、监听器常见应用
监听器在GUI中常用
过滤器:
用户登录之后才能进入主页,注销后就不能进入主页
1.用户登录后,向session中放入用户的数据
2.进入主页的时候要判断用户是否已经登录;在过滤器中实现
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse) servletResponse;
Object session_id = request.getSession().getAttribute("SESSION_ID");
if (session_id==null){
response.sendRedirect("/login.jsp");
}
filterChain.doFilter(servletRequest, servletResponse);
}