1.1 Jsp中脚本片段,声明,表达式
1.1.1 脚本片段 <% %>
<% String str1 = "局部变量"; // 局部代码段,这里面的代码都是局部的 %>
1.1.2 声明 <%! %>
<%! String str1 = "全局变量"; // 全局代码段,这里面的代码都是全局的 %>
1.1.3 表达式<%= >
<%= //称作jsp表达式,用于将已经声明的变量或者表达式输出到网页上面。 %>
1.2 注释
1.2.1 html注释
<!--
<%
System.out.println("html注释里面的代码依旧会执行");
%>
-->
1.2.2 jsp注释
<%--
System.out.println("jsp注释中的代码不会执行");
--%>
1.3 jsp 本质
jsp本质是servlet;
jsp编译后或变成xxx_jsp.java,xxx_jsp.class;
jsp编译后放的目录:工作空间\.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\myWeb01\org\apache\jsp
1.3.1编译后的路径
1.3.2 编译后的代码
3、JSP9大内置对象
final javax.servlet.http.HttpServletRequest request; // request请求对象 作用域
final javax.servlet.http.HttpServletResponse response; // response响应对象
final javax.servlet.jsp.PageContext pageContext; // pageContext 当前页面上下文 作用域
javax.servlet.http.HttpSession session = null; // session 会话 作用域
final javax.servlet.ServletContext application; // application 服务器 作用域
final javax.servlet.ServletConfig config; // config 配置对象
javax.servlet.jsp.JspWriter out = null; // out 输出对象
final java.lang.Object page = this; // page 当前页面对象
exception // exception 异常对象
4、乱码问题
4.1 请求乱码问题
4.1.1 post请求乱码
request.setCharacterEncoding("utf-8");
4.1.2 get请求乱码问题
tomcat8以后默认编码格式是utf-8,之前是iso-8859-1,所以所以现在的get请求很少有乱码问题;
//get请求乱码处理。两种方式:
//方式1:修改server.xml,强制指定参数传输中的字符集编码方式
//在修改tomcat默认端口配置项中,增加一个参数
URIEncoding="UTF-8"
//注意tomcat8.5版本后,默认对get请求已经变成了utf-8,不需要增加,以前是ISO-8859-1
//方式2:修改server.xml,在修改tomcat默认端口中,
增加useBodyEncodingForURI = "true"
//注意此配置是针对get请求乱码,让其使用post的请求处理方式(一般不需要)
//方式3:强制转码,前提你要知道来源编码,才可以转目标编码URIEncoding="ISO-8859-1" ->目标编码 UTF-8
userName = new String(userName.getBytes("ISO-8859-1"),"UTF-8");
4.2 响应乱码
//设置响应头的编码,页面接收响应的编码,页面以什么编码接收后端响应回来的内容
response.setHeader(“Content-Type”, “text/html;charset=UTF-8”);
//后端以什么编码响应给前端
response.setCharacterEncoding(“UTF-8”);
5、转发和重定向的区别
5.1 转发和重定向
//转发到成功页面
//转发是客户端行为
request.getRequestDispatcher("success.jsp").forward(request, response);
//重定向到登录页面
//重定向是客户端行为
response.sendRedirect("userLogin.jsp");
5.2 跳转资源不同
转发访问的资源仅限于服务内部所有资源,不可以访问外部资源,但是重定向可以(除WIN-INFO之外);
//使用重定向跳转到百度页面 可以
response.sendRedirect("https://www.baidu.com");
//使用重定向跳转到百度页面 可以
response.sendRedirect("https://www.baidu.com");
5.3 对WEB-INFO的访问不同
转发可以访问到WEB-INFO下的资源,重定向不可以访问到;
//使用转发,跳转到WEB-INF安全目录中的页面 可以
request.getRequestDispatcher("../WEB-INF/OK.jsp").forward(request, response);
//使用重定向跳转到WEB-INF安全目录中的页面 不可以
response.sendRedirect("../WEB-INF/OK.jsp");
5.4 "/"代表的含义不同
// 此处的 / 交给服务器进行解析,代表的是应用根目录(ip+端口+项目发布资源名)
request.getRequestDispatcher("/success.jsp").forward(request, response);
//导航栏跳转的路径:http://localhost:8096/kh96-01/doLogin2.jsp "/"表示ip+端口+项目发布资源名
//此处的 /交给浏览器进行解析,代表的是站点(ip+端口)
response.sendRedirect("/userLogin.jsp");
//导航栏跳转的路径:http://localhost:8096/userLogin.jsp "/"表示ip+端口 没有项目名
5.5 总结
转发和重定向的区别(牢记:转发是服务器端行为,重定向是客户端行为):
- 转发访问的资源仅限于服务内部所有资源,不可以访问外部资源,但是重定向可以(除WIN-INFO之外);
- 转发转发的地址栏显示的地址是首次访问的地址,后续所有的转发操作都是内部实现的,地址栏看不到,只显示第一次请求的地址,但是重定向的地址栏显示的是最后一次的地址栏;
- 转发"/"代表的含义不同,转发是交给服务器处理,而重定向是交给浏览器处理,代表站点;
- 转发转发会携带请求,不会重新发起请求,全程request对象只用一个;重定向每次都是浏览器发起的,都是一个新的请求,即request对象每次都是新的;
6、request 请求对象 (作用域)
可以转发;
方法 | 说明 |
---|---|
getParameter("name") | 获取表单提交的数据 |
setArrribute(Stirng key,Obbject value); | 保存一次请求的数据 |
getArrribute(Stirng key) | 过去请求中存放的数据 |
7、response 响应对象
可以重定向;
8、session 会话 (作用域)
session的会话跟踪机制:
-
session是浏览器和服务器之间的一次通话,首次访问任何一个jsp页面,服务端会自动给当前访问的用户创建一个唯一的session对象并将该session对象的唯一标识sessionid返回给浏览器,浏览器拿到该sessionid后,会自动保存到浏览器的内存中,当浏览器再次发起新的请求时,会自动将内存中保存的sessionid作为参数提交到服务端,如:JSESSIONID=6F3973CF90CE1401DA6987D35CB6BD10
-
服务端拿到该sessionid,就可以自动获取到对应的那个session对象,进而就可以通过session对象获取用户数据,当浏览器关闭(退出进程),内存中保存的sessionid就自动释放,重新打开浏览器,访问jsp请求到服务器端,由于没有了sessionid,服务器端就不知道session对象是哪个,默认是新用户请求,会重新再创建新的session对象,返回给浏览器端,重复上述操作。
方法 | 说明 |
---|---|
getId() | 获取sessionId |
session.setAttribute("key","value"); | 存放参数 |
session.getAttribute("keys"); | 获取参数 |
session.invalidate(); | 清除session对象 |
session.removeAttribute("key"); | 移除参数 |
session.setMaxInactiveInterval(10); | 设置session超时时间,秒 |
8.1session会话清除机制
8.1.1 方式1:程序主动清除session对象,session.invalidate();
//通知服务器端,立刻删除当前用户的session对象,服务器中对应的session对象就不存在,之前保存的用户信息就无效,下一次就必须登录
session.invalidate();
8.1.2 session.removeAttribute(String key);
// 方式2:程序主动删除属性,是服务器端session对象中保存的某个属性,session.removeAttribute(String key);
session.removeAttribute("sessionUser");
8.1.3 务器主动删除,通过设置服务器端session会话对象的超时时长
// 方式3:服务器主动删除,通过设置服务器端session会话对象的超时时长,达到时长,自动删除,单位是 秒
session.setMaxInactiveInterval(10);
8.1.4 服务器主动删除,通过修改服务器默认session超时时长配置
// 方式4:服务器主动删除,通过修改服务器默认session超时时长配置,tomcat中默认session对象的超时时长是:30分钟
// tomcat的默认配置文件:tomcat目录下/conf/web.xml中有默认配置,如果需要修改,就讲如下配置,拷贝到自己项目中的web.xml中
<session-config>
<session-timeout>10</session-timeout>
</session-config>
// 注意:不是说session对象超时就是30分钟,如果在30分钟内有操作session对象,超时会顺延,只有没有操作到达30分钟,才会删除。
9、四大作用域
作用域 | 范围 |
---|---|
pageContext | 当前页面 |
request | 当前请求 |
session | 当前会话 |
application | 当前服务器(应用) |
范围大小:pageContext < request < session < application;
10、cookie
cookie创建:Cookie cookie = new Cookie("userRem",userName+"-"+userPwd);
方法 | 说明 |
---|---|
cookie.setMaxAge(10 * 60); | 设置过期时间,单位:秒 |
response.addCookie(cookie); | 响应返回cookie |
request.getCookies(); | 从请求中获取cookie数组 |
cookie.getName(); | 获取cookie的name |
cookie.getValue(); | 获取cookie的value |
11、定制错误页面
<!-- 可能会发生错误的页面 -->
<%@page errorPage="500.jsp" %>
<!-- 定制的错误页面 -->
<%@ isErrorPage = "true"%> <!-- 只用写了这个才能使用exception对象 -->
<%=exception.getMessage() %> <!-- 通过ecxeption对象输出错误信息 -->
12、引入页面
12.1 静态导入
先将页面jsp导入,再将两个页面合成的jsp再编译;(注意变量冲突,引入页面的变量和本页面的变量会冲突)
<%@ include file="top.jsp"%>
举例:
main.jsp
<!--引入顶部页面 -->
<%@ include file="top.jsp"%>
top.jsp
<h2>顶部页面</h2>
12.2 动态导入
先编译你两个页面,再引入页面;(不会产生变量冲突)
<jsp:include page="botton.jsp"/>
举例:
main.jsp
<!--引入顶部页面 -->
<jsp:include page="botton.jsp"/>
botton.jsp
<h2>底部页面</h2>
被编译后的文件目录: