11-JSP 快速入门
第 1 章 : JSP 入门
课时 1 JSP 入门
Java Server Pages
jsp 本质就是 Servlet
jsp:在原有 html 基础上添加 java 脚本
分工:
jsp 显示数据
servlet 处理数据
jsp -> servlet -> jsp
jsp 组成:
1、html + java 脚本 + jsp 标签(指令)
2、9 个内置对象:
request response session application pageContext config out page exception
3、3 种脚本
<% %> Java代码片段,多条代码 <%=%> Java表达式,一条代码 <%!%> 声明成员
课时 2 JSP 中 Java 脚本的演示
html 中的 base 标签
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // java语句 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); // http://localhost:8080/demo %> <%=basePath%> <% // 等价于 out.print(basePath); %> <%! // 成员变量 int a = 5; // 成员方法 public void getValue(){ System.out.print("hi"); } %> <% int a = 10; // 局部变量 %> 访问局部变量: <%=a%> 访问成员变量: <%=this.a%> <% // 调用成员方法 getValue(); %> 列表循环 <% for(int i=0; i< 10; i++){ %> <%=i%> <% } %>
课时 3 JSP 和 Servlet 分工的案例
计算器示例
获取表单数据 form.jsp
把字符串转换成 int 类型
进行加法运算得到结果
保存数据结果到 request 中
转发到 result.jsp
处理流程
form.jsp -> servlet -> result.jsp
代码文件
<form action="calculate" method="post"> <input type="text" name="num1" /> <input type="text" name="num2" /> <input type="submit" /> </form>
CalculateServlet.java
package com.pengshiyu.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CalculateServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取参数 String s1 = request.getParameter("num1"); String s2 = request.getParameter("num2"); // 类型转换 int num1 = Integer.parseInt(s1); int num2 = Integer.parseInt(s2); // 求和 int result = num1 + num2; // 赋值 request.setAttribute("result", result); // 转发 request.getRequestDispatcher("/result.jsp").forward(request, response); } }
result.jsp
<%=request.getAttribute("result")%>
课时 4 JSP 的原理
jsp 是一个特殊的 servlet
第一次访问 jsp 页面时,服务器会把 jsp 编译成 java 文件,一个 servlet 类
再把.java 文件编译成.class 文件
创建该类对象
最后调用它的 service()方法
第二次访问同一个 jsp 页面时,直接调用 service()方法
流程图
第一次访问: 客户端 -> 服务器 -> jsp -> java -> class -> 创建Servlet对象 -> 调用service()方法 第二次之后访问: 客户端 -> 服务器 -> jsp -> 调用service()方法
jsp 编译为 java 类
jsp java类 =============================================== 头 定义9个内置对象 为9个内置对象赋值 =============================================== 体 html out.write() <% %> 原样搬运 <%=%> out.print() <%!%> 声明成员 <%-- --%> 注释不做翻译 =============================================== 尾 做异常处理
课时 5 JSP 中的注释
html注释 <%-- --%> jsp注释,不会输出到html文件中
第 2 章 : Cookie 处理
课时 6 Cookie 入门
Cookie 是 http 协议
由服务器创建保存到客户端浏览器的一个键值对
服务器响应头
Set-Cookie: key1=value1; key2=valu2
客户端浏览器下次请求时会带上 Cookie
客户端请求头
Cookie: key1=value1; key2=valu2
规定:
1 个 Cookie 最大 4kb
一个服务器最多给一个浏览器 20 个 cookie
一个浏览器最多保存 300 个 cookie
用途:
服务器跟踪客户端状态
购物车
JavaWeb 中使用:
(1)原始方法 response发送Set-Cookie响应头 request获取Cookie请求头 (2)便捷方法 response.addCookie() request.getCookies()
示例
setCookie.jsp
<h2>设置Cookie</h2> <% Cookie cookie = new Cookie("key", "value"); response.addCookie(cookie); %>
getCookie.jsp
<h2>获取Cookie</h2> <% Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie c: cookies){ out.print(c.getName() + ": "+ c.getValue()); } } %>
课时 7 Cookie 的生命
maxAge:Cookie 保存的最大时间,以秒为单位
maxAge>0 会保存到客户端硬盘 maxAge<0 只会在内存中,浏览器关闭就删除 maxAge=0 删除cookie eg: cookie.setMaxAge(60)
课时 8 Cookie 的路径
path 设置需要归还的 cookie 作用域
默认值为当前路径的父级目录
eg: cookie.setPath('/') eg: cookieA /demo cookieB /demo/jsp/ cookieC /demo/jsp/html/ /demo/index.jsp -> cookieA /demo/jsp/index.jsp -> cookieA、cookieB /demo/jsp/html/index.jsp -> cookieA、cookieB、cookieC
课时 9 Cookie 的域
domain 指定共享域名
eg: cookie.setDomain('.baidu.com') cookie.setPath('/') 共享:www.baidu.com、zhidao.baidu.com
第 3 章 : HttpSession
课时 10 HttpSession 入门
HttpSession 用于会话跟踪,保存在服务器端
1、Servlet 三大域对象:
request
session
application
2、HttpSession 底层依赖:
Cookie 或是 Url 重写
3、会话范围
用户首次访问服务器开始,到该用户关闭浏览器结束
4、Servlet 中获取 session
HttpSession = request.getSession()
5、jsp 中的 session 是内置对象,可以直接使用
<% void session.setAttribute(String name, String value); Object session.getAttribute(String name); void session.getAttribute(String name); %>
课时 11-12 HttpSession 第一例
创建和获取 session
setSession.jsp 创建 session
<h2>设置Session</h2> <% session.setAttribute("name", "Tom"); %>
getSession.jsp 获取 session
<h2>获取Session</h2> <%=session.getAttribute("name")%>
课时 13 HttpSession 第二例
登录
思路
login.jsp -> LoginServlet 登录失败跳转回 login.jsp -> admin.jsp 未登录跳转回 login.jsp
使用 session 关闭浏览器后就消失
可以使用 cookie 设置保存时长,持久化到浏览器中
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 如果有msg就显示 String msg = (String)session.getAttribute("msg"); if(msg == null){ msg = ""; } %> <h2>登录</h2> <div style="color: red"><%=msg%></div> <% // 清空session中的msg session.removeAttribute("msg"); %> <form action="/demo/login" method="post"> <input type="text" name="username"><br/> <input type="text" name="password"><br/> <input type="submit"> </form>
LoginServlet.java
package com.pengshiyu.servlet; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); HttpSession session = request.getSession(); if ("admin".equals(username) && "123456".equals(password)) { session.setAttribute("username", username); // 添加Cookie Cookie cookie = new Cookie("username", username); cookie.setMaxAge(60 * 60 * 24); // 保存一天 response.addCookie(cookie); response.sendRedirect("session/admin.jsp"); } else { session.setAttribute("msg", "账号或密码不正确"); response.sendRedirect("session/login.jsp"); } } }
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 从session中获取 // String username =(String)session.getAttribute("username"); // 从cookie中获取 String username = null; Cookie[] cookies = request.getCookies(); for (Cookie c :cookies){ if(c.getName().equals("username")){ username = c.getValue(); break; } } if(username == null){ request.getSession().setAttribute("msg", "用户未登录"); response.sendRedirect("login.jsp"); } %> <h2>欢迎<%=username%></h2>
课时 14 HttpSession 原理
sessionId 保存到 cookie 中
request.getSession(false) // 不会创建sessionId request.getSession(true) // 会创建sessionId request.getSession() // 会创建sessionId
课时 15 配置 session 最大不活动时间
public interface HttpSession { long getCreationTime(); String getId(); // 获取sessionId long getLastAccessedTime(); ServletContext getServletContext(); // 设置最大不活动时间,默认30分钟 void setMaxInactiveInterval(int var1); int getMaxInactiveInterval(); // 让session失效 void invalidate(); // 查看是否为新的,判断客户端第一次请求 boolean isNew(); Enumeration getAttributeNames(); Object getAttribute(String var1); void setAttribute(String var1, Object var2); void removeAttribute(String var1); }
web.xml 中配置 session 最大不活动时间
<session-config> <!-- 单位:分钟 --> <session-timeout>30</session-timeout> </session-config>
课时 16 session 之 url 重写
如果浏览器的 cookie 被禁用了,可以将 sessionId 在 url 参数中传递
// 如果cookie中没有会加到url上 response.encodeURL()