Spring web mvc重点
1、Springwebmvc工作流程
a.浏览器发出一个http请求
b.请求首先进入DispatcherServlet主控制器
c.主控制器调用HandlerMapping组件,根据请求找映射的Controller处理
d.执行Controller处理方法,将返回结果给ViewResolver组件
e.ViewResolver组件根据Controller返回结果定位视图JSP,将模型数据传递给JSP
f.由JSP生成响应结果,给浏览器输出
2.Springwebmvc开发过程
a.搭建SpringMVC开发环境
b.流程设计
请求–>DispatcherServlet–>HandlerMapping–>Controller组件(变化)–>ViewResolver–>JSP组件(变化)
c.编写jsp,Controller组件
d.配置处理流程
如何解决中文接收乱码问题
可以用request的编码解码方法在最前面设置。
也可以通过过滤器Filter在中间设置编码就可以了。
request.setCharacterEncoding(“utf-8”)
不要忘了过滤器也还要在web.xml中配置
在Spring-web-*的jar包里提供了一些filter、servlet可以用
CharacterEncodingFilter(Spring-web.jar)
如何去处理异常
有全局的处理和单独的Controller处理
看对应状态码 然后 root case
可以用try catch
向外抛异常,抛给DispatcherServlet(但是要配置异常处理器)
Spring配置文件中配置
<!-- 异常处理器-->
<bane class=”org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”>
<property name=”exceptionMapping”>
<props>
<prop key=”java.lang.Exception(异常类型)”>视图页面名称</prop>
</props>
</property>
</bean>
例子:简单年龄计算
Controller (加入异常处理)
package Controller;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AgeController {
//进入age.jsp
@RequestMapping("/toage.do")
public String toagecontraller(){
return "age";
}
@RequestMapping("/age.do")
public String agecontroller(String birth, ModelMap model) throws Exception{
//接收用户输入的生日,计算年龄
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birth1 = (Date) sdf.parse(birth);
int age = now.getYear()-birth1.getYear();
model.put("msg", "你的年龄"+age);
return "age";
}
//当前Controller异常处理。写在哪个Controller就在哪个有效
//出现异常,优先找当前Controller的异常处理方法。没有才回去容器找全局异常处理方法
@ExceptionHandler//局部异常处理手段
public String handleException(HttpServletRequest request,Exception e){
request.setAttribute("msg", "输入格式有误!");
return "age";
}
}
age.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>age</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="age.do"method="post">
<h1>年龄计算器</h1>
请输入你的生日:<input type ="text" name="birth" >
<input type="submit" value="开始计算">
</form>
${msg}
</body>
</html>
如何实现登陆权限检查
使用session进行约定值的判断
实现方法:1.采用Filter;****2.采用拦截器(SpringMVC)
a.拦截器组件简介
是SpringMVC特有组件。
拦截器可以在Controller之前拦截;
也可以在Controller之后拦截;
还可以在JSP解析完毕输出之前拦截
写一个登陆后才能看到年龄计算器
用拦截器控制 session中是否有值。有则可以进入。没有则重定向到登陆界面。
登陆控制
package Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//扫描到Spring容器
public class toLogonController {
@RequestMapping("tologin.do")
public ModelAndView execute(){
ModelAndView mav = new ModelAndView("login");
return mav;
}
@RequestMapping("login.do")
public String checkLogin(HttpServletRequest request){
String username=request.getParameter("username");
String password=request.getParameter("password");
if(username.equals("root")&&password.equals("1234")){
HttpSession session = request.getSession();
session.setAttribute("username", username);
session.setMaxInactiveInterval(30);
return "age";
}else
return "login";
}
}
拦截器:
package Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor{
//请求处理完毕,输出之前
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
//Controller之后
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}
//Controller之前
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
//增加登陆检查
//获取登陆成功后放置的用户信息
HttpSession session = arg0.getSession();
String name = (String)session.getAttribute("username");
if(name!=null){//登陆过
return true;
}else{//未登陆或登录失败
arg1.sendRedirect("tologin.do");
return false;
}
}
}
配置:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 所有的都拦截就这么写 -->
<mvc:mapping path="/**"/>
<!-- 放过哪些请求 -->
<mvc:exclude-mapping path="/tologin.do"/>
<mvc:exclude-mapping path="/login.do"/>
<bean class="Interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
没有登陆过直接去访问 toage.do 就会跳转到登陆界面
登陆成功后才可以看到年龄计算器
我设置了最大时间 30后session就会失效。
遇到的最大的问题就是拦截,拦截哪些。还有就是逻辑问题。
拦截器适合共通逻辑。也是SpringMVC特有的。