- 会话跟踪
- cookie
- session
- filter
- listener
- MVC
- model
- controller
- 前后端分离
- AJAX
- 工作原理
- 属性和方法
- jQuery
- json
- 常用的会话跟踪技术是cookie和session,保证用户在会话期间的数据管理
- cookie会在本地记录信息,不安全
- 设置cookie,在业务类中(因为路由先到这,再返回页面)
cookie cookie = new cookie("jieguo","true"); response.addcookie(cookie);
- 这个可以在浏览器查看到,属于客户端行为
- 服务端获取客户端携带的cookie,验证并返回页面
<% cookie[] cookies = request.getcookies(); if(cookies != null) for(cookie c : cookies){ String name = c.getName();//获取cookie名称 if("jieguo".equals(name)){ String value = c.getValue();//获取cookie的值 bool = Boolean.valueOf(value);//将值转为Boolean类型 } } %>
- 删除cookie
//1.创建⼀个name为username的cookie cookie cookie = new cookie("username", "aaa"); //2.设置cookie的有效时间为0 cookie.setMaxAge(0);//删除cookie的关键 //3.将cookie发送给浏览器,来替换同名cookie response.addcookie(cookie);
- 注:以上演示都是在服务器,客户端(浏览器)有默认的保存cookie的行为
- session的内容会存在服务器,比较安全,但占用空间(session⾥的信息应该尽量精简)
- 一般登录成功后会在session存储用户名密码等,在同一个浏览器的不同请求都可以获取已登录状态
- 同样可以设置过期时间
HttpSession session = request.getSession(); // 获取Session对象 session.setAttribute("loginTime", new Date()); // 设置Session中的属性 out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性 // 过期时间 session.setMaxInactiveInterval(longinterval) // 分钟 // 也可以在web.xml设置
30 - 设置失效
session.invalidate()
- cookie 一般保存的是session ID,通过ID确定session信息后即可保持登录状态、获取相关数据
- 过滤器实际上就是对web资源进⾏拦截,做⼀些处理后再交给下⼀个过滤器或servlet处理
- 例如大部分页面都需要登录后访问,可以添加过滤器验证
// 新建util.FilterTest.java public class FilterTest implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化filter"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("begin filter"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("end filter"); } @Override public void destroy() { System.out.println("destroy filter"); } }
- web.xml中也要配置
过滤器名称 过滤器所在的路径 过滤器名称 public static Connection getConnection(){ try { return ds.getConnection(); } catch (SQLException throwables) { throwables.printStackTrace(); } return null; } public static void close(Connection conn, Statement state, ResultSet rs){ try { rs.close(); } catch (Exception throwables) { throwables.printStackTrace(); } try { state.close(); } catch (Exception throwables) { throwables.printStackTrace(); } try { conn.close(); } catch (Exception throwables) { throwables.printStackTrace(); } } } // druid.properties url=jdbc:mysql://localhost:3306/mvc?useUnicode=true&characterEncoding=utf-8 username=root password=123456 driverClassName=com.mysql.cj.jdbc.Driver initialSize=5 maxActive=10 minIdle=5 maxWait=3000
- service层定义业务逻辑,接口名称:bean+Service
// 定义业务逻辑 // 这里就是简单调用一下dao层的实现 public interface StudentService { public List
getAll(); } public class StudentServiceImpl implements StudentService { private StudentDao studentDao = new StudentDaoImpl(); @Override public List getAll() { return studentDao.getStudents(); } } - servlet调用service层的代码
// 相当于 Controller 管理路由+限定请求方法+调用业务类+返回页面 @WebServlet(urlPatterns = "/getstuall") public class StudentServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1 接受请求参数 // 2 调取service层方法 StudentServiceImpl studentService = new StudentServiceImpl(); List
all = studentService.getAll(); // 3 跳转页面 req.setAttribute("slist", all); req.getRequestDispatcher("/show.jsp").forward(req, resp); // req存的值作用域是单次请求,只能dispatcher } } - 可以启动了,注意Druid配置文件的路径,可能要改为相对路径
- 以公共接口为桥梁
- AJAX = Asynchronous Javascript and XML
- 在不重新加载整个⻚⾯的情况下,AJAX 与服务器交换数据并更新部分⽹⻚
- 是⼏种原有技术的结合体
- 使⽤CSS和XHTML来表示
- 使⽤DOM模型来交互和动态显示
- 使⽤XMLHttpRequest来和服务器进⾏异步通信
- 使⽤javascript来绑定和调⽤
- AJAX 的核⼼是 XMLHttpRequest 对象,发送异步请求
- 相当于在⽤户和服务器之间加了—个中间层(AJAX引擎),使⽤户请求与服务器响应异步
化
- 普通的交互方式:发出请求,等待服务器回复
- ajax交互方式:Javascript发出请求,不必等待,可以继续发出请求
- 并不是所有的⽤户请求都提交给服务器
- —些数据验证和数据处理等都交给Ajax引擎⾃⼰来做(异步)
- 确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求
- 案例:验证用户名有效性
<%-- Created by IntelliJ IDEA. User: Windows10 Date: 2021/12/31 Time: 20:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
ajax username test username:@WebServlet(urlPatterns = "/test") public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 接收参数 String username = req.getParameter("username"); resp.setContentType("text/html;charset=UTF-8"); PrintWriter writer = resp.getWriter(); if ("admin".equals(username)) { writer.println("账户已被注册"); }else { writer.println("账户名可用"); } } }
- 只能新建项目,不能和上一节的xzk目录并行
- span里还是不显示中文,只有???
- 都是基于XMLHttpRequest
- 主要介绍readyState,存有服务器响应的状态信息,每当 readyState 改变时,onreadystatechange 函数就会被执⾏,这个回调是异步的基础,可以了解一下
- open(),第⼀个参数定义发送请求所使⽤的⽅法,第⼆个参数规定服务器端脚本的URL,第
三个参数规定应当对请求进⾏异步地处理 - send() ⽅法将请求送往服务器,(从前到后,open就是个准备,还需send执行)
xmlHttp.open("GET", "/test?username="+username, true); xmlHttp.send(null); // 如果是get xmlHttp.open("POST","test.php",true); var params = "userName=" + uname+ "&userPass=" +upass+ "&time=" +Math.random(); // 增加time随机参数,防⽌读取缓存 xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8"); // 向请求添加 HTTP 头,POST如果有数据⼀定加加!!!! xmlHttp.send(params);
- get 还是 post?
- 异步还是同步
- jQuery实现AJAX
# jquery_ajax.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %>
jquery jQuery ajax test username:- 后端路由需要改一下,servlet处理方法不变
- 后端路由需要改一下,servlet处理方法不变
- 拿捏住,ajax 就是用已有组件、由前端发起的、在BS中间插了一杠子的异步请求方式
- 传数据呀,传字符串或者xml都过时了,还是要用json
- JSON (Javascript Object Notation) 是⼀种轻量级的数据交换格式
- 大致看一下定义和取值
json - 转换,依赖 json-lib-2.2.2-jdk15.jar,scope=compile即可
package tajax; public class User { private String name; private Integer age; public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
public class UserTest { public static void main(String[] args) { User user = new User("roy", 11); // java -> json JSONObject jsonObject = JSONObject.fromObject(user); System.out.println(jsonObject); // json -> java String str = "{"age":11,"name":"roy"}"; JSONObject jsonObject1 = JSONObject.fromObject(str); Object bean = JSONObject.toBean(jsonObject1, User.class); System.out.println(bean); // User{name='roy', age=11} // 集合也是类似的 } }
- 更新页面只需要Update classes…,更改类需要Restart
- 案例:json+ajax 实现输入用户id自动填充信息
- 之前设置了jar包compile(需要provided),所以访问页面可能会找不到jar包
- 可以直接放到tomcat的lib里,删除out重启;或者删除lib重新Modules
- 后端返回后,还会涉及到一个eval("("rs")")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)