查看文档需求,思考+设计+写代码
中央调度器
请求调度器是一个servlet
前端发送过来请求需要经过中央调度器来进行分配和调度,中央调度器只会调用请求路径与之url路径匹配的请求路径。
处理器映射器则是根据请求的URL路径找到对应的处理器(即Controller)来处理请求。
处理器适配器会调用可适配的处理器(Controller),并将请求包装成HandlerInvocation对象进行处理。HandlerInvocation对象包含了请求、响应、处理器等信息,它将请求和处理器解耦,使得处理器只需要关心如何处理请求,而不必关心请求如何传递、处理结果如何返回等问题。
这里配置了/,意思是处理所有来自客户端的请求,包括所有的URL地址。
使得Tomcat的默认Servlet无法处理静态资源,因为所有的请求都会被中央调度器拦截并处理,而不论请求的是动态资源还是静态资源。
为了能使静态资源被控制器对象处理,需要在applicationContext-dispatcher ,也就是springmvc配置文件中加入标签<mvc:default-servlet-handler /><!--静态资源释放-->
和 <!--解析ajax请求的注解驱动--> <mvc:annotation-driven/>
详解点此
处理进入登录页面
因为中央调度器拦截了所有的请求,因此我们需要用Controller来转发请求,从首页跳转到登录页面
@Controller 注解 applicationContext-dispatcher中扫描,将bean对象放入spring容器中管理
@RequestMapping(“/”) 中央调度器的请求路径与之匹配,走public String index()方法
Controller对象职责
接收参数,封装参数–>无参数
调用Service方法->无调用
响应信息到浏览器->跳转页面,配合在apllicationContext-dispatcher中的视图解析器IRVR,因此为String类型的返回值
Controller类中的方法必须是public的访问权限,因为最后是dispatcherServlet也就是中央调度器调用方法的,dispatcherServlet和Controller不是一个包的,也没有继承关系,所有必须是public方法。
美工给我们的是.html静态页面,我们需要改成.jsp动态页面。
注意idea对html和jsp网页的默认编码方式不一样的,idea对html默认是iso8859-1,对jsp是utf-8
中文在iso8859-1和utf-8中是不一样的,于是将html网页的编码设置成utf-8再转换为jsp
在html的网页第一行添加编码格式,jsp的编码模式<%page contenType="charset="text/html;charset=UTF-8" language="java" %>
处理进入工作区页面
用户登录,页面跳转及验证
细节:
从底层开始:
mapper–service–controller–客户端
1、查询不需要判断异常,只需要判断查询出的数据是否为空。但增删改需要判断异常。
2、判断是否用户过期,需要同当前时间和数据库中的时间进行比对。数据库的时间格式不固定,可能会修改,我们需要让当前时间和数据库的时间格式相同,通过字符串的形式进行比对.compareTo
。
格式相同,定义公共类TimeUtils,将当前时间转为与数据库格式相同的字符串形式。
跨模块使用的类放到公共的包下,公共的包下有公共的类。公共类也有分类。公共的实体类,工具类,常量类。
SimpleDateFormate sdf = new SimpleDateFormate("yyyy-MM-dd HH:mm:ss");
String str = sdf.formate(date);
3、免登录:将用户名和密码新建cookie,存入硬盘cookie,设置最大时间setMaxAge
,过期则cokkie自动删除数据,前端页面通过jstl语句<c:if test="${}" >
判断是否勾选上,来写不同的状态,通过获取${cookie.key.value}
来自动填充
session通过HttpRequestServlet进行读取和存入
cookie 通过HttpResponseServlet进行读取和存入
注意:当cookie的key值和另一个新建的cookie的key值相同时,旧cookie值会被覆盖成新cookie。
把控制层的数据传递给视图层
1、ajax @ResponseBody
2、作用域
pageContext:页面范围之内传递数据,不同标签之间传递数据。jstl中的标签底层对应的都有一个java类。
request:从发起请求开始到响应请求结束。(一次请求中传递数据)
session:一次会话。在同一个浏览器窗口中,不同请求之间传递数据。
application:所有用户长久频繁使用的共享数据。
作用域中的数据在jsp中取数据需要用el表达式,${对象名}
${}默认从域中取数据,先从pageContext走,再从request走,再走session,最后走application,为了提高效率我们直接定义从session中走。
${作用域.key} ${sessionScope.sessionUser.name}
4、实现回车登录
$(window).keydown(function(e){
if(e.keyCode==13){
$("loginBtn").click();
}
})
5、前端回车或者点击登录按钮时,
收集参数
var loginAct=$.trim($("#loginAct").val());
var loginPwd=$.trim($("#loginPwd").val());
var isRemPwd=$("#isRemPwd").prop("checked");
表单验证 alert,return
为了让用户不着急,在提示信息位置,在ajax响应之前,提示正在努力验证的字眼$("#id").html("正在努力验证")
响应ajax
$.ajax({
url:'',
data:{},
type:'',
dataType:'',
success:function(data){}
})
<button type="button" id="loginBtn" class="btn btn-primary btn-lg btn-block" style="width: 350px; position: relative;top: 45px;">登录</button>
异步请求,type=button,同步type=submit
同步请求和异步请求的区别:
同步请求:浏览器窗口发出的请求,响应信息返回到浏览器窗口,所以会进行全局刷新。
异步请求:ajax发出的请求,响应信息返回到ajax的回调函数,既可以进行全局刷新,也可以进行局部刷新。
用户安全退出
同步刷新。
删除session session.invalidate()
销毁cookie cookie.setMaxAge(0);reponse.addCookie(cookie);
用户安全退出的Controller与需要跳转的页面的路径不同,因此需要使用重定向return "redirect:/";
拦截所有的用户请求 拦截器
根据文档,用户访问任何业务资源,都需要进行登录验证
也就是拦截用户的所有请求看是否已经登录,登录的人cookie有值,没有登录的,cokkie没值或者查看session,只有登录成功的人才有session。
1、提供拦截器类继承HandlerInterceptor接口实现他的三个方法preHandler,postHandle,afterCompletion
框架对拦截器进行了封装,我们需要在applicationContext-dispatcher 中配置拦截器
拦截的是业务资源,也就是访问Controller的请求,我们写Conytroller的requestMapping的时候是和页面资源路径对应打钩的
/*代表一层任意的子目录
/**代表多层的子目录
注意1、不能拦截登录页面,否则会造成死循环2、不能拦截登录验证的页面,此时也没有登录成功。排除拦截请求的优先级高