网站开发计划表,自己做的网站怎么接数据库,百度云登陆首页,个人电脑搭建成网站服务器今日内容 零、 复习昨日 一、请求转发 二、重定向 三、Session 四、Filter 零、 复习昨日 一、请求转发
1.1 现有问题
响应的代码与接收请求代码在一起查询全部的代码与登录的代码在一起,考虑一下后续删除完,更新完要查全部怎么办?这也没有遵循单一职责,不便于后期维护ps: 开…今日内容 零、 复习昨日 一、请求转发 二、重定向 三、Session 四、Filter 零、 复习昨日 一、请求转发
1.1 现有问题
响应的代码与接收请求代码在一起查询全部的代码与登录的代码在一起,考虑一下后续删除完,更新完要查全部怎么办?这也没有遵循单一职责,不便于后期维护ps: 开发6个原则: 开闭原则里氏替换依赖倒置单一职责迪米特法则 (最少知道原则)接口隔离
1.2 解决
将代码拆开再单独设计个Servlet去做查询全部查询全部之后做响应登录成功后,让请求转发到查询全部去执行
1.3 演示
1.3.1 请求转发跳转servlet
WebServlet(/login)
public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(1 接收请求 );System.out.println(2 调用业务层处理数据 );// 查询全部/*** 请求转发,* 是服务器内部动作*/// RequestDispatcher rd req.getRequestDispatcher(/list);// rd.forward(req,resp);// 一般会简写req.getRequestDispatcher(/list).forward(req,resp);System.out.println(5 登录结束.... );}
}WebServlet(/list)
public class ListServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(3查询全部数据... );System.out.println(4 查询全部响应 );}
}1.3.2 请求转发跳转页面
WebServlet(/d1)
public class PageServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*** 请求转发是服务器动作,从服务器根路径出发* 服务器资源的根路径:/webapp/* a.html b.jsp 都定义在/webapp/下* c.jsp在 /webapp/WEB-INF/下,所以请求转发时需要加上WEB-INF*/// req.getRequestDispatcher(/a.html).forward(req,resp);// req.getRequestDispatcher(/b.jsp).forward(req,resp);req.getRequestDispatcher(/WEB-INF/c.jsp).forward(req,resp);}
}1.4 请求域 **是什么?**域,就是区域,就是一块空间,存储数据,其实理解为map集合 什么时候用? 在两个servlet请求转发时,会存在A类的数据需要传递给B类 此时就需要使用请求对象的请求域功能 怎么用? req.setAttribute(key,value),这样就可以将数据存储在请求对象 再另外一个servlet使用请求对象取出值req.getAttribute(“key”) 在一个servlet中存入请求域 在另外一个servlet中取出 ps: 主要是配合jsp使用,在jsp中取值的,但是现在没有讲jsp,暂时了解 1.5 总结 请求转发其实两个功能 利用请求对象可以发请求跳转页面或者servlet利用请求对象存取数据 1.6 特点[背住]
请求转发: 地址栏不变,这是一次浏览器请求请求转发: 是服务器内部行为当做域对象使用,即相当于容器,可以装载数据两个servlet中请求域数据在一次请求转发中共享 回忆政府办公场景… 二、响应重定向
重定向也可以使用Servlet直接的跳转,以及跳转页面.
resp.sendRedirect(路径);演示: 特点 重定向是响应重定向,是浏览器行为两次请求地址栏会变化请求域数据无法共享 三、Session对象【重点】
状态管理,比较常见的就是登录状态
会话? 浏览器 — 服务器 3.1 Session概述 Session用于记录用户的状态。Session指的是在一段时间内单个客户端与Web服务器的一连串相关的交互过程。在一个Session中客户可能会多次请求访问同一个资源也有可能请求访问各种不同的服务器资源。 3.2 Session原理 服务器会为每一次会话分配一个Session对象 同一个浏览器发起的多次请求同属于一次会话(Session) 首次使用到Session时服务器会自动创建Session并创建Cookie存储SessionId发送回客户端,后续再发请求,就会带上cookie,后端就会接收到该cookie中的sessionId从而获得session中的数据 注意session是由服务端创建的,存储在服务器注意: cookie是由服务器创建的,存储在浏览器 3.3 Session使用 Session作用域拥有存储数据的空间作用范围是一次会话内有效 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭则结束会话可以将数据存入Session中在一次会话的任意位置进行获取可传递任何数据(基本数据类型、对象、集合、数组) 3.3.1 获取Session session是服务器端自动创建的通过request对象获取 //获取Session对象HttpSession sessionrequest.getSession();System.out.println(Idsession.getId());//唯一标记3.3.2 Session保存数据 setAttribute(属性名,Object)保存数据到session中 session.setAttribute(key,value);//以键值对形式存储在session作用域中。ps: 登录成功后将登录信息存储到session
3.3.3 Session获取数据 getAttribute(属性名);获取session中数据 session.getAttribute(key);//通过String类型的key访问Object类型的valueps: 后续其他请求获取session,判断是否有对应的权限或者是否登录
3.3.4 Session失效
// 调用方法销毁
session.invalidate();//手工销毁
// 浏览器关闭,原有的Session会失效,相对于是没了ps: 退出登录后,清空session
3.4 Session域与Request域应用区别 request是一次请求有效只有一次请求转发内数据可以获得session是一次会话内有效无论请求转发还是重定向都是可以获得数据的 3.5 模拟登录认证[重点] 现有2个资源,一个是登录/login,一个是/list,没有登录认证之前,可以不用登录就可以访问/list所对应的资源,但是不合理,因此我们需要实现登录信息的认证! 即在操作/list等其他请求时,我们需要判断这次请求前有没有登录,如果没有登录就响应(请求转发)到登录页面,如果以前登录过,那就该干什么干什么… 如何实现? 需要在登录成功时,将登录信息存入session需要在操作/list等请求时先判断session有无登录信息 登录成功后存储session WebServlet(/login)
public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 登录成功,session存储数据HttpSession session req.getSession( );session.setAttribute(username,tomcat);System.out.println(登录...);}
}其他请求中获取session WebServlet(/list)
public class ListServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 先判断有无登录HttpSession session req.getSession( );String username (String) session.getAttribute(username);if (username ! null !.equals(username)) {// 假设这下面就是操作的功能,现在暂时用输出语句代替,,,System.out.println(查询全部...);} else {// 没有登录,应该跳转到登录页面resp.sendRedirect(/index.jsp);}}
}退出时销毁session 设置一个请求按钮,或者超链接点击退出到登录页,同时销毁session 3.6 总结 session的实际应用: 1 登录时存储2 拦截器中取出数据,判断是否登录,如果已经登录有数据,那就放行,如果没有跳转至登录页3 退出时销毁session 四、过滤器Filter【重点】 4.1 现有问题 在以往的Servlet中有冗余的代码多个Servlet都要进行编写。 比如编码格式设置登录信息认证 4.2 概念 过滤器Filter是处于客户端与服务器目标资源之间的一道过滤技术。 过滤器 4.3 过滤器作用 执行顺序在Servlet之前客户端发送请求时会先经过Filter再到达目标Servlet中响应时会根据执行流程再次反向执行Filter 可以解决多个Servlet共性代码的冗余问题例如乱码处理、登录验证 4.4 编写过滤器 Servlet API中提供了一个Filter接口开发人员编写一个Java类实现了这个接口即可这个Java类称之为过滤器Filter 编写Java类实现Filter接口 在doFilter方法中编写拦截逻辑 设置拦截路径 /* 拦截所有请求路径/a 拦截指定的/a请求*.do 拦截指定的后缀请求 4.5 过滤器链和优先级
4.5.1 过滤器链 客户端对服务器请求之后服务器调用Servlet之前会执行一组过滤器多个过滤器那么这组过滤器就称为一条过滤器链。 每个过滤器实现某个特定的功能当第一个Filter的doFilter方法被调用时Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中开发人员如果调用了FilterChain对象的doFilter方法则Web服务器会检查FilterChain对象中是否还有filter如果有则调用第2个filter如果没有则调用目标资源。 过滤器链
4.5.2 过滤器优先级 在一个Web应用中可以开发编写多个Filter这些Filter组合起来称之为一个Filter链。 优先级 如果为注解的话是按照类全名称的字符串顺序决定作用顺序 4.6 过滤器应用1:全局编码
以前: 在每个servlet为了防止乱码,在进行操作之前,都先设置请求和响应的编码格式.
现在: 使用拦截器,对所有请求拦截器,设置编码,然后放行 package com.qf.servlet.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;/*** --- 天道酬勤 ---** author QiuShiju* desc 对所有请求都是设置编码格式*/
WebFilter(/*)
public class EncodingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException { }Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 设置编码格式request.setCharacterEncoding(UTF-8);response.setContentType(text/html;charsetUTF-8);// 放行chain.doFilter(request,response);}Overridepublic void destroy() { }
}
4.7 过滤器应用2: 身份认证拦截器
以前: 在web项目中,在每个Servlet中都要对身份进行认证
现在: 使用拦截器,将身份过滤的代码前置到拦截器,对每个请求先身份认证
package com.qf.servlet.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;/*** --- 天道酬勤 ---** author QiuShiju* desc*/
WebFilter(/*)
// WebFilter(/hw/*)
// WebFilter(*.do)
public class LoginFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException { }/*** 对请求的身份进行认证* 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行* 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页*/Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 获取sessionHttpServletRequest req (HttpServletRequest) request;HttpSession session req.getSession( );String requestURI req.getRequestURI( );/*** 因为是拦截所有 /** 所以要放行 静态资源以及第一次登录的请求*/if(requestURI.contains(login)) {// 放行chain.doFilter(request, response);} else {// 从session获得数据String username (String) session.getAttribute(username);// 判断if (username ! null){// 放行chain.doFilter(request, response);} else {HttpServletResponse resp (HttpServletResponse) response;resp.sendRedirect(/index.jsp);}}}Overridepublic void destroy() { }
}五、总结 关于web开发,服务器代码,就是主要就是接收请求,作出响应 如何发请求?请求如何与servlet对应?请求到Servlet类后,又是如何接收请求数据?如何作出响应? web开发,遵循一些开发设计规范 控制层,写servlet代码业务层,写业务逻辑代码数据层,写jdbc代码 如果想要跳转页面或其他servlet 请求转发重定向 如果需要记录项目,登录状态, session 如果需要将一些重复代码前置 filter 六、作业
重新写一个web项目,需求实现登录,查询全部
1) 项目启动登录页
2) 登录成功查询全部
3) 没有登录时直接查询全部,跳转到登录页
4) 利用filter,session完成登录认证和编码过滤