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 总结

转发和重定向的区别(牢记:转发是服务器端行为,重定向是客户端行为):

  1. 转发访问的资源仅限于服务内部所有资源,不可以访问外部资源,但是重定向可以(除WIN-INFO之外);
  2. 转发转发的地址栏显示的地址是首次访问的地址,后续所有的转发操作都是内部实现的,地址栏看不到,只显示第一次请求的地址,但是重定向的地址栏显示的是最后一次的地址栏;
  3. 转发”/”代表的含义不同,转发是交给服务器处理,而重定向是交给浏览器处理,代表站点;
  4. 转发转发会携带请求,不会重新发起请求,全程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>

被编译后的文件目录: