JavaWeb-JSP
JSP
JSP简介
Java Server Page,是前端交互的页面,与静态页面不同,JSP可以动态的处理用户的数据,其本质上是一种Servlet。
Servlet+JSP模式:
Servlet职责:
-
接收参数
-
处理业务逻辑
-
将结果存到域对象中
-
跳转到JSP页面
JSP职责:
- 从域对象中取出数据
- 将数据打印到前端中
开发原则:尽量不要再JSP页面中放入过多的Java代码
JSP原理
在早期没有JSP的年代,开发人员还是用Servlet,调用写方法,将HTML文件一行一行的写出去,达到向网站输出HTML文件与动态数据的目的,但是由于过于繁琐,后面开发出一种新的文件JSP,JSP看上去与HTML文件没什么不同,只是可以嵌套Java代码,具体流程是:

当用户访问jsp资源时,服务器会根据jsp资源,自动生成java文件并且编译成class文件,而查看该class文件时可以发现, 该jsp会继承HttpJspBase类,而HttpJspBase类又是HttpServlet的子类,因此,访问jsp实际上就是在访问Servlet
本机的路径是C:\Users\12902\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_JavaWeb_2\work\Catalina\localhost\Servlet_war_exploded\org\apache\jsp
在jsp所生成的class文件中,有些地方与servlet是类似的:
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request,HttpServletResponse response){
}
另外,以index.jsp为例,打开其index_jsp.class文件,可以发现其中声明的内置对象:
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session对象
final javax.servlet.ServletContext application; //ServletContext对象
final javax.servlet.ServletConfig config; //config对象
javax.servlet.jsp.JspWriter out = null; //Writer对象
final java.lang.Object page = this; //当前Jsp对象
request //请求
response //响应
通用代码结构

JSP指令
JSP有三大指令,分别是page,include,taglib
指令的作用:对当前JSP页面进行配置,可以理解成注解?
指令的格式
<%@page 属性名1=属性 属性名2=属性%>
- page指令:

- include指令:
JSP可以通过include指令来包含其他文件,比如文本文件、JSP文件或HTML文件,包含的文件会被视为JSP文件中的一部分,会被同时编译执行。
语法格式:
<%--该指令会将两个页面合二为一--%>
<%@include file="path"%>
<%--该指令本质上还是两个页面,命名空间互不影响--%>
<%@include page="path"%>
- taglib指令:JSP-API允许自定义标签,该指令引入一个自定义标签集合的定义,包含库路径和自定义标签。
基本语法
<%--注释--%>
<%//Java代码块%>
<%!
//Java方法定义,成员定义
%>
<%=
//打印变量
%>
常用内置对象

request对象
request对象封装了客户端产生HTTP请求的所有细节,主要包括HTTP头信息、请求方式、请求参数、系统信息。通过request对象可以处理HTTP请求中的各项参数。
获取请求参数
通过超链接发送请求时,可以在后面加上?属性名1=属性1&&属性名2=属性2,来传递参数,会自动保存到request中, 跳转到该超链接的页面时,可以通过getParameter(String name)方法获取,该方法同样适用于表单提交。
作用域中管理属性
通过两个方法:
setAttribute与getAttribute方法来设置属性与获得属性。
需要注意的是request的作用范围:只在一次请求中有效。
获取Cookie
设置编码
设置编码的范围:浏览器向服务器发送的请求的编码
request.setCharacterEncoding("编码格式");
获取客户端信息
用request对象可以获取客户端的相关信息,如HTTP报头、客户信息提交方式、客户主机IP地址、端口号等。
常用方法:

response对象
response对象用于响应客户端的请求,向客户端输出信息,封装了JSP产生的响应,并发送到客户端以响应客户端的请求,
响应的数据可以是任意类型的数据,甚至可以是文件
重定向网页
使用response对象的sendRedirect方法可以将网页重定向到另一个页面,重定向操作支持将地址重定向到不同的主机上,这一点与转发不同,重定向后,地址栏的URL会变成重定向网页后的URL,用户可以从地址栏看到重定向后的地址,重定向后,request中的属性失效,并重新新建一个request对象。
语法格式
response.sendRedirect(String path);
处理HTTP响应文件头
response.setHeader(String name,String value);
response对象可以处理HTTP响应文件头,常用于以下业务场景:禁用缓存,页面自动刷新和定时跳转网页
- 禁用缓存:
默认情况下,浏览器会对显示的网页内容进行缓存,以提高浏览网页的速度,但是在一些安全性要求较高的网站,通常会禁用缓存
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
- 页面自动刷新
response.setHeader("Refresh", "10");
//单位秒
- 定时跳转网页
response.setHeader("Refresh", "10;URL=login.jsp");
设置输出缓冲
通常情况下,服务器输出到浏览器的内容不会直接写到客户端,而是先写入输出缓冲区,缓冲区(文件输出或输入暂时储存的区域),打个比方:装卸车队和传送带,装卸车队装卸的粮食速度远超传送带,因此可以设置一个这样的站台,当要车队需要装粮食时,先将粮食置于该站台,达到一定数量,再叫车队过来装货,当要卸粮食时,先将车上的粮食置于站台,再让传送带慢慢传送走粮食,这样一个站台就起到了缓冲的作用。
response提供了以下方法来配置缓冲:

session对象
Session,即会话,由于HTTP是一种无状态协议,就是说当一个用户发起请求给服务端,服务端处理请求,发出响应给客户端,连接就结束了,服务端并不保存任何信息,但是实际上可能需要服务端储存一些信息。为此引入了session,通过session,用户在进行浏览器跳转时,可以保存用户的状态,直到关闭浏览器,会话结束,session对象消失,另外当用户在同一个页面累计待一定的时间,超过超时时间时,session对象也会消失。
作用范围:用户关闭浏览器/在同一个页面待超过超时时间
常用方法:

application对象
application对象用于储存所有用户、客户端共享的数据,在服务器创建时诞生,在服务器关闭时销毁,所有的用户共享该application对象,与session相比,生命周期更长,相当于全局变量。
常见方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VC8R9aCm-1622197163893)(C:\Users\12902\AppData\Roaming\Typora\typora-user-images\image-20210427165845457.png)]
比如一个业务需求:记录浏览器访问次数,就可以用到application。
- 访问初始化参数
application对象提供了访问初始化参数的方法,应用程序的初始化参数在web.xml中进行配置,web.xml文件位于Web应用下的WEB-INF目录下,在web.xml文件中通过
比如:在web.xml中配置连接数据库所需的url参数
<content-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://127.0.0.1:3306/db_database</param-value>
</content-param>
配置完毕后,怎么访问呢?
/*getInitParameter(String key)与getInitParameterNames方法*/
//方法一
String url = application.getInitParameter("url");
//获取初始化参数名的枚举
Enumberation<String> enums = application.getInitParameterNames();
while(enums.hasMoreElements()) {
String name = enums.nextElement();
String value = application.getInitParameter(name);
out.print(name + ":" +value);
}
- 管理应用程序属性
application应该是四大作用域中作用域最大的,只要服务器没有关闭,都是有效的。
application.setAttribute("username", "root");
application.setAttribute("visitTimes", 0);
String username = (String) application.getAttribute("username");
application.removeAttribute("visitTimes");
out对象
out对象用于向页面打印信息,还可以管理应用服务器上的输出缓冲区,在使用out对象输出数据时可以清除缓冲区中的数据,为其他数据让出空间。
- 输出数据
out.print("nihao!");
out.println("world");
- 管理输出缓冲区
out对象有另一个重要的作用就是对缓冲区进行管理,调用out的clear方法可以清除缓冲区中的内容,若响应已经提交会出现IOException异常,另外的一个方法clearBuffer则不会出现该异常。

pageContext对象
获取页面上下文对象,通过它可以获得request、response、session、application等对象
常用方法:
其中:forward方法等价于request的request.getRequestDispatcher("path").forward(request, response)

四大作用域
四大作用域针对四个对象:pageContext、request、session、application都可以用来存放数据。
作用范围从小到大依次为:pageContext、request、session、application。

存放数据的有效范围:
pageContext:只对当前页有效。
request:只支持一次请求,该请求可以被转发,数据属于一次性用品,比如:新闻弹出
session:用户关闭浏览器之前都是有效的。用户过一段时间还要用的数据,比如:购物车
application:服务器关闭之前,都是有效的。用户共用的数据,比如:浏览次数
EL表达式、JSTL标签
EL表达式
引入这些的EL表达式和JSTL标签的目的,就是在JSP尽量不要出现Java代码,JSP属于用户视图,若存在大量Java代码不便于后期维护。
使用前提:先将page指令中的isELIgnored设置为false,默认是true,表示是否忽略EL表达式。
使用场景:通常可以在某个作用域(pageContext,request,session,application)中取得属性值
特点:1.简单 2.自动转换类型
<%--通用格式--%>
${}
<%--从session中获取属性值--%>
${sessionScope.username}
<%--EL表达式比较字符串用单引号--%>
${sessionScope.username=='小明'}
JSP标签
JSP自带的标签有:include、forward、param
<%--标签的使用格式--%>
<jsp:include page="index.jsp">
- include标签:
用于在当前位置包含另一个页面,页面之间相互独立,不共享命名空间
- forward标签:
实现页面跳转,其实用Java代码也可以完成页面跳转,但是基于JSP里尽量不写Java代码的原则,尽量用标签。
- param标签:通常与forward标签连用,实现在页面跳转时传递参数。
暂时常用的是这三个标签。
JSTL标签库
有时候想用标签执行一定的逻辑,用JSP自带的标签还不太够,为此引入了JSTL标签库。
步骤:
1.引入标签库(https://www.runoob.com/jsp/jsp-jstl.html)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.引用标签
<%c:out value="${sessionScope.username}"%>
常用标签库及其示例
最常用的核心标签(C标签)

- c:if:
<body>
<%
session.setAttribute("username", "小明");
%>
${sessionScope.username=='小明'}
<c:set var="password" value="1" scope="session" />
<%--test,boolean值,EL表达式可以用判断条件,但是如果是字符串的比较,用单引号--%>
<c:if test="${sessionScope.username=='小明'&& sessionScope.password=='2'}">
<c:out value="芜湖!起飞"/>
</c:if>
</body>
- c:foreach:
<body>
<%
List<String> list = new ArrayList<>();
list.add("rookie");
list.add("theshy");
list.add("ning");
session.setAttribute("nameList",list);
%>
<%--items,待遍历的集合,var变量名相当于i,begin起始下标,end最终下标--%>
<c:forEach var="item" begin="0" end="2" items="${sessionScope.nameList}">
<c:out value="${item}"/> <br>
</c:forEach>
</body>
JavaBean
JavaBean简介
在经典的MVC三层架构中,M代表Model模型,V代表View视图,C代表Controller控制器,在JavaWeb项目中,模型由JavaBean充当,视图由JSP来充当,控制器由Servlet来充当。
JavaBean是一个遵循特定写法的Java类,具有以下特点:
- 该类需包含一个无参构造函数
- 该类中的属性需全部私有化
- 所有属性需要对外提供get和set方法
JavaBean与数据库有所联系:
- 表-->类名
- 字段名-->属性
- 行记录-->对象
public class UserInfo{
private String username;
private String password;
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return this.username;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return this.password;
}
}
JSP中使用JavaBean
利用JSP的标签:jsp:useBean、jsp:setProperty、jsp:getProperty
- jsp:userBean
<%--类比Java创建对象--%>
<%--UserInfo userInfo = new UserInfo();--%>
<jsp:useBean name="userInfo" class="UserInfo.class" scope="pageContext|request|session|application" />
- jsp:setProperty
<%--相当于调用了set方法--%>
<%--写法一--%>
<jsp:setProperty name="userInfo" property="username" value="String字符串|EL表达式" />
<%--写法二--%>
<jsp:setProperty name="userInfo" property="password" param="parameterName" />
- jsp:getProperty
<%--相当于调用了get方法--%>
<jsp:getProperty name="userInfo" property="password" />

浙公网安备 33010602011771号