新职课(chapter5-3)

新职课(chapter5-3),第1张

新职课(chapter5-3)

文章目录
  • 会话跟踪
    • cookie
    • session
    • filter
    • listener
  • MVC
    • model
    • controller
    • 前后端分离
  • AJAX
    • 工作原理
    • 属性和方法
    • jQuery
    • json

会话跟踪
  • 常用的会话跟踪技术是cookie和session,保证用户在会话期间的数据管理
cookie
  • 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⾥的信息应该尽量精简)
  • 一般登录成功后会在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信息后即可保持登录状态、获取相关数据
filter
  • 过滤器实际上就是对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
    
controller
  • 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
  • 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
  • jQuery实现AJAX
    # jquery_ajax.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        jquery
    
    
    
    
        jQuery ajax test
        username: 
    
    
    
    • 后端路由需要改一下,servlet处理方法不变
  • 拿捏住,ajax 就是用已有组件、由前端发起的、在BS中间插了一杠子的异步请求方式
json
  • 传数据呀,传字符串或者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")")

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5692911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存