- Tomcat 9
- Java Server Page(Java 服务页)
一:JSP 初识
使用 JSP 文件
JSP 是 HTML 文件与 Java 文件的混合文件,HTML 文件可以直接通过浏览器打开,Java 文件使用Java虚拟机进行编译。
JSP 文件需要借助第三方(比如:Tomcat)编译 -> .java -> 执行 -> .class -> 信息传给浏览器,最后通过浏览器展示。
JSP 文件的创建
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<body>
<%
此处书写Java代码,尖括号外书写HTML代码
%>
</body>
</html>
<%@ page 属性=值 %>
头信息标签,说明当前JSP的一些内容
contentType="text/html;charset=UTF-8"
说明当前JSP里面拼接好的相应信息浏览器该如何解析language="java"
说明当前JSP中可以包含的语言pageEncoding="UTF-8"
告知服务容器(比如:Tomcat)以这种字符集进行编译,如果不写就遵循 contentType 中所写的 charset
<% %>
标签内书写 Java 代码,该标签可以出现在任意位置
JSP中的不同<%%>形式的标签(代码标签)
<%@ %>
做说明 通常放在头部<%! %>
生成的代码存在 xxx_jsp.java 类中,作为成员存在,通常用来定义属性与方法<% %>
生成的代码存在 xxx_jsp.java 类中的 _jspService() 方法内部,通常是写逻辑<%= %>
生成的代码存在 xxx_jsp.java 类中的 _jspService() 方法内部,通常用来赋值或者打印输出
二:JSP 九个内置对象
内置对象放置在 JSP 生成的 .java 代码中的 _jspService 方法内部
- HttpServletRequest request 一次请求
- HttpServletResponse response 客户端响应信息
- HttpSession session 一次会话
- ServletContext application 全局对象上下文
- JSPWriter out 输出对象
- Object page 当前页对象(比如:xxx.jsp 文件对应的 xxx_jsp.java 文件)
- PageContext pageContext 页面对象上下文
- ServletConfig config 读取信息对象
- Exception exception 异常对象
(1)HttpServletRequest request
String = request.getParameter("key");
- 用来设置接受请求参数时的字符集(比如:UTF-8)
request.setCharacterEncoding("UTF-8");
- 存储某一个自己产生的数据;获取之前一次请求中request对象存储的数据
request.setAttribute("key", Object);
Object = request.getAttribute("key");
RequestDispatcher rd = request.getRequestDispatcher("path");
rd.forward(request, response);
Enumeration = request.getParameterNames();
- 获取 key 一致的一组 value 值,通常用作复选框
String[] = request.getParameterValues("key");
- 统一资源定位器(Uniform Resource Locator);统一资源标识符(Uniform Resource Identifier)
StringBuffer = request.getRequestURL();
String = request.getRequestURI();
request.getHeader("Host");
request.getHeader("Accept-Language");
Enumeration = request.getHeaderNames();
协议头信息 举例:
GET /index.jsp HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Webstorm-2f8f75da=1b88d886-30e2-4089-abc9-af9030089775
借助 request.getHeader("Accept-Language");
可以实现国际化:通过获取浏览器首选语言,决定页面展示语言(后端进行处理)
HttpSession = request.getSession();
Cookie[] = request.getCookies();
(2)HttpServletResponse response
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write("");
这个方法并不常用,并且相同功能可以由内置对象 JSPWriter
的 out.write();
实现
int = response.getStatus();
response.setStatus(int);
response.addCookie(Cookie);
Cookie 是在客户端(浏览器端)存储的一个记录
new Cookie("key", "value");
key 不可以为 null 且字符串长度不能为零
response.sendRedirect(String);
转发和重定向的区别:
请求转发 | 请求重定向 |
---|
RequestDispatcher 类 | HttpServletResponse 类 |
request.getRequestDispatcher("path").forward(request, response) | response.sendRedirect("path"); |
转发是在服务器内部完成,服务器内部传递 req resp,是一次请求 | 重定向是服务器告知浏览器,让浏览器重新再发一个请求,服务器需要解析新的请求,获得新的req resp,是两次请求 |
转发的时候浏览器URL不会改变 | 重定向的时候浏览器的URL会发生改变 |
转发只能在当前服务器的当前工程内部 | 重定向可以发送给新的服务器或新的工程 |
(3)HttpSession session
session.setAttribute("key", Object);
Object = session.getAttribute("key");
session.removeAttribute("key");
Enumeration = session.getAttributeNames();
- Session 设置最大的不活跃时间,默认值为 1800秒==30分钟(即浏览器与服务器连接过程中,30分钟没有交互,则 Session 进入不活跃状态,无法使用)
session.setMaxInactiveInterval(int);
- Session 失效(销毁 Session 对象)
session.invalidate();
String = session.getId();
(4)ServletContext application
全局上下文对象 作用域是所有 Servlet 对象(包括 JSP 文件生成的 Java 文件)
ServletContext = application.setAttribute("key", Object);
Object = application.getAttribute("key");
application.removeAttributer("key");
Enumeration = application.getAttributeNames();
- application 获取 Servlet 对象加载时携带的信息
所有 Servlet 对象共用的信息为 application,web.xml 文件“根标签”下进行如下配置:
<context-param>
<param-name>key1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>key2</param-name>
<param-value>value2</param-value>
</context-param>
...
获取作用于所有 Servlet 对象的信息
String = application.getInitParameter("key1");
Enumeration = application.getInitParameterNames();
- 获取项目部署后文件的路径(web项目部署后文件路径一般会变化)
String = application.getRealPath("文件路径");
补充三个与路径相关的方法:
StringBuffer = request.getRequestURL();
String = request.getRequestURI();
InputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("文件路径");
(5)四个作用域对象
作用域对象 | 范围 |
---|
PageContext pageContext | 只有在当前页作用域中可以访问(xx_jsp.java当前这个类的范围内) |
HttpServletRequest request | 一次请求的范围之内 |
HttpSession session | 一次会话的范围内(同一个"人"的多次请求 ) |
ServletContext application | 全局范围之内(多个session共享) |
以上四个作用域对象都有四个操作属性的增删改查方法
(6)ServletConfig config
读取配置文件中某个Servlet携带的信息
String = config.getInitParameter("key");
Enumeration = config.getInitParameterNames();
String = config.getServletName();
ServletContext application = config.getServletContext();
(7)Exception exception
500 是服务器运行错误,服务器若不做处理则部分源代码会暴露给用户
需要设置一个专门反馈错误的 jsp 文件:
- 假设创建 error.jsp 文件,需要在头信息标签中添加一组属性值:
<%@ page isErrorPage="true" %>
- 其余 JSP 文件的头信息标签中添加另一组属性值:
<%@ page errorPage="error.jsp" %>
- 假若其余 JSP 文件出现异常,信息将会转发给 error.jsp 文件处理,然后响应给浏览器
三:JSP 指令标签
通常放置在 JSP 头部,做说明性质的描述
(1)<%@ page %>
属性值 | 作用 |
---|
contentType="text/html;charset=UTF-8" | 告知浏览器解析时遵循的字符规则 |
language="java" | 告知 JSP 中含有的语言(默认为Java) |
pageEncoding="UTF-8" | 告知 Tomcat 解析 JSP 时遵循的字符规则 |
import="" | 在JSP中导入的 Java 文件的包 |
isErrorPage="true" | 设置当前 JSP 作为一个异常页 |
errorPage="xxx.jsp" | 转发到异常页 |
- Tomcat 将 JSP 解析成 Java 文件时遵循的字符规则优先级:pageEncoding > charset > Tomcat 字符集
- 浏览器解析响应信息遵循的字符规则优先级:charset > pageEncoding > 浏览器字符集
(2)<%@ taglib %>
JSTL(Jsp Standard Tag Library,JSP 标准标签库)
例如:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
两个属性分别是资源路径、前缀
(3)<%@ include %>
在当前 JSP 中引入已经写好的资源
该标签只有一个属性 file="jsp文件或者html文件路径"
- include 标签引入一个 JSP 资源正常(不会出现中文乱码的问题,脚本也同时好用)
- include 标签引入一个 HTML 资源(会产生中文乱码,即便是设置了 charset 也不好用)
- HTML 是解释性语言,JSP 引入 HTML 时会按照平台字符集(一般为GBK)解析后拿过来展示在浏览器上(其实就是 JSP 头标签对字符编码的设置无法影响引入的 HTML 资源)
- 解决上述 HTML 乱码问题需要配置 web.xml 文件,根标签下进行如下配置即可
<jsp-config>
<jsp-property-group>
<url-pattern>*.html</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
- 扩展介绍(看下方代码),jsp-property-group 标签下子标签是有顺序的
- description 标签是介绍,display-name 组名,其余标签显示的是默认值
<jsp-config>
<jsp-property-group>
<description>JSPConfiguration</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
<jsp-property-group>
<description>HTMLConfiguration</description>
<display-name>HTMLConfiguration</display-name>
<url-pattern>*.html</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
</jsp-config>
四:JSP 动作标签
用来替代 JSP 中 java 的一些操作(创建对象、对象的赋值取值、请求转发…),只是技术演变过程中的一个临时产物
技术演变
- 技术最早是 ModelOne 模式
- 只有 Servlet
- 并且是 M + VC 模式(MVC 模式中 VC 杂糅在一起,拼接响应信息 V 很麻烦)
- 技术小革新 ModelTwo 模式
- Servlet + JSP
- MVC 模式中 VC 区分开(Servlet 处理 C,JSP 处理 V)
- JSP 技术出现以后,写法比较简单、更像是一个文件资源,而且这个文件中还能直接写 Java 程序
- 除了使用 JSP 实现 V,还使用 JSP 实现 M(因为 JSP 本质上是 Servlet)
- 运行性能存在问题:不安全、管理不方便
- JSP2.0 出现动作标签
- JSP 展示时会出现一些逻辑问题
- 所有 JSP 的标签风格不统一
- 出现两个新技术:EL(Expression Language) + JSTL(Jsp Standard Tag Library)
- 新的模板语言产生
JSP 六个动作标签
<jsp:xxx>
(1)创建对象
<jsp:useBean id="" class="" scope=""></jsp:useBean>
(2)对象的属性赋值
<jsp:setProperty name="" property="" value=""></jsp:setProperty>
或者(前者取固定值,后者取传过来的值)
<jsp:setProperty name="" property="" param=""></jsp:setProperty>
(3)对象的属性取值
<jsp:getProperty name="" property=""></jsp:getProperty>
(4)、(5)请求转发
<jsp:forward page=""></jsp:forward>
转发时携带参数:
<jsp:forward page="">
<jsp:param name="" value=""></jsp:param>
<jsp:param name="" value=""></jsp:param>
...
</jsp:forward>
(6)
<jsp:include page="">
与 <%@ include file="" %>
功能相同
例子演示
...
Atm atm = new Atm();
atm.setAname(aname);
atm.setApassword(apassword);
atm.setAbalance(Float.parseFloat(abalance));
Enumeration en = request.getParameterNames();
while(en.hasMoreElements()){
String key = (String)en.nextElement();
String value = request.getParameter(key);
}
...
Servlet 部分代码(创建对象、对象的赋值取值、请求转发…),替换为 JSP 动作标签:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="atm" class="domain.Atm" scope="request"></jsp:useBean>
<jsp:setProperty name="atm" property="*"></jsp:setProperty>
<%--注释: property与param相同,所以上一行可以替换下面三行--%>
<jsp:setProperty name="atm" property="aname" param="aname"></jsp:setProperty>
<jsp:setProperty name="atm" property="apassword" param="apassword"></jsp:setProperty>
<jsp:setProperty name="atm" property="abalance" param="abalance"></jsp:setProperty>
<%--注释: 请求转发并携带参数--%>
<jsp:forward page="">
<jsp:param name="testKey1" value="testValue1"></jsp:param>
<jsp:param name="testKey2" value="testValue2"></jsp:param>
...
</jsp:forward>
- JSP 三个代码标签
<% %>
<%! %>
<%= %>
- JSP 三个指令标签
<%@ page %>
<%@ taglib %>
<%@ include %>
- JSP 六个动作标签
<jsp:xxx>
,xxx
包含:useBean、setProperty、getProperty、forward、param、include - JSP 四个作用域 page(pageContext) request session application
- JSP 九个内置对象 request response session application out page pageContext config exception
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)