目录
学习目标
- MVC模式
- jsp
- jstl和el表达式
- 会话跟踪技术
mvc模式
这种模式用于应用程序的解耦、分层开发
- Model:一般用来处理数据,包括读取和设置数据,一般指的是操作数据库。
- View:一般用来展示数据,也就是放数据,比如通过HTML来展示。
- Controller:因为一个模块里面可能由多个视图——模型,控制器就起到了连接模型和视图的功能。
软件开发3层架构
什么是jsp
- 全称java server page,主要为了弥补servlet输出页面太过麻烦的缺点。
servlet注重的是流程控制和事务处理
jsp注重的是页面展示 - JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容
JSP运行基本过程
同步请求动态资源过程
JSP标准标签库(JSTL)
- 需要standard.jar和jstl.jar(菜鸟)
- 核心标签库是最常用的JSTL标签。
- 引用<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- <c:forEach> 基础迭代标签,接受多种集合类型
- <c:if> 与我们在一般程序中用的if一样
JSP EL隐含对象
JSP EL支持下表列出的隐含对象:
隐含对象 | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
会话跟踪技术session
- session是一门服务端会话缓存技术。
- session由服务端的web容器创建,保存在服务器端。
- session保存数据:键值对形式。
- session过期:默认30分钟。
什么是cookie
不超过4KB的小型文本文件,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密)。
- cookie是一门客户端缓存技术
- cookie数据由服务器生成,发送给浏览器保存
- cookie数据的格式:键值对
- cookie数据过期机制:内存Cookie浏览器关闭后就消失。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除
练习:登录+js操作cookie
运行结果截图
初始界面:
输入错误的用户名和密码:
返回错误:
输入正确的用户名和密码:
返回ok:
Cookie已保存:
返回后用户名仍缓存:
工程截图
User.java
package com.one.pojo;
import lombok.Data;
@Data
public class User {
private int userId;
private String userName;
private String userPwd;
public User(int userId, String userName, String userPwd){
super();
this.userId = userId;
this.setUserName(userName);
this.setUserPwd(userPwd);
}
public User(String userName, String userPwd){
super();
this.setUserName(userName);
this.setUserPwd(userPwd);
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
UserServlet.java代码
package com.one.servlet;
import com.one.pojo.User;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class UserServlet
*/
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
List<User> list=null;
/**
* @see HttpServlet#HttpServlet()
*/
public UserServlet() {
list = new ArrayList<>();
list.add(new User(1,"zs","666"));
list.add(new User(2,"lisi","888"));
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
if("login".equals(action)){
login(request, response);
}else if("findAll".equals(action)){
findAll(request, response);
}
}
private void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将list放入request值域中
request.setAttribute("list", list);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接受请求并响应
// 1.获取请求参数并封装为对象
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
// 2.数据验证 非空 正则表达式
// 3.登录业务处理,得到登陆业务结果
boolean b = false;
for(User user : list){
if(user.getUserName().equals(username)&&user.getUserPwd().equals(userpwd)){
b = true;
}
}
// 4.根据结果进行跳转
if(b){
//服务器内部转发,同一请求,地址栏不会变化,登陆成功后,将用户信息放入session值域
request.getSession().setAttribute("user", new User(username, userpwd));
//登录成功,记住密码,存放到cookie
Cookie c = new Cookie("username",username);
c.setMaxAge(1*24*60*60);//存放1天,以秒为单位
response.addCookie(c);
//response.getWriter().append("{data:'ok',status:1}");
/**
PrintWriter out = response.getWriter();
String str = "{\"data\":\"ok\",\"status\":\"1\"}";
out.println(str);
out.flush();
**/
PrintWriter pw = response.getWriter();
String jsonStr = "{status:1, message:\"ok\"}";
pw.print(jsonStr);
//从一个控制成跳到另一个控制层方法
//服务器内部转发,同一请求,地址栏不会变化
//request.getRequestDispatcher("userServlet?action=findAll").forward(request, response);
}else{
//重定向,二次请求,地址栏发生变化
//response.getWriter().append("{data:'error',status:0}");
PrintWriter out = response.getWriter();
String str = "{\"data\":\"error\",\"status\":\"0\"}";
out.println(str);
out.flush();
//response.sendRedirect("login.jsp?msg=error");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 欢迎你,<%=request.getParameter("username") %> -->
欢迎你,${sessionScope.user.userName}----${param.username}
循环${requestScope.list}集合,取出每一个user 作业jsp ---jstl+el
<c:forEach items="${requestScope.list}" var="user">
${user.userName}---${user.userPwd}
</c:forEach>
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${param.msg}
<form action="userServlet" method="get">
<input name="username" value = "${cookie.username.value}"/><br/>
<input name="action" value="login" type="hidden"/><br/>
<input name="userpwd" type="password" value = "${cookie.userpwd.value}"/><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>