一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发
Model-View-controller,即模型-视图-控制三层结构,三层每层负责不同的功能,其中,model层用于封装简单的javaBean和复杂的javaBean,包括业务层,甚至dao层,只要是个javabean都属于model(java仅仅只是pojo对象,也可以是一个包含复杂逻辑的service),pojo对象的代码都是包含的,视图层主要是页面,用于返回给用户的,直观的一种可视化的界面,比如jsp,html,包扩c/s的等,而Controller主要到控制,并且和用户交流的作用,比如,如果你要登陆,那么控制层就会返回一个登陆的页面给你,当你提交页面后,控制层就会调用model的业务
逻辑方法来验证你的输入是否正确。这就是一个mvc简单的调用过程
注解:
@Controller 控制器
@RequestMapper("user")可以定义一个以/user/路径public class HelloController {@RequestMapper("请求对应方法名")}
@RequestParam
value: 参数名字 请求中的参数名字
required :必须的,默认为true
defaultValue 默认值
public String getId(Model model,@RequestParam("id") int ids) {}
转发和重定向
转发 return forward:
重定向: redirect:
配置web.xml
<servlet><servlet-name> SpringMvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>SpringMvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
springmvc.xml文件
读取包
<context:component-scan base-package="包名"/>
配置映射器
<!-- 手动配置处理器映射器在Spring3.1 后就废弃了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandllerMapping--><!-- <bean class = "org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> </bean>那么所对应的适配器也要使用
配置视图解析器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> --><!-- 视图解析器配置InternalResourceViewResolver默认使用z最终路径 前缀+视图+后缀--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 视图的前缀--><property name="prefix" value="/WEB-INF/page/"></property><!-- 视图的后缀--><property name="suffix" value=".jsp"></property></bean>
转换器
定义一个类继承接口Converter (需要转换的类型)
数据类型转换
public class DateConverter implements Converter<String, Date> {/**比如,页面s:需要转换的数据类型T:需要转换的目标数据类型*/@Overridepublic Date convert(String str) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {Date date = sdf.parse(str);return date;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}
xml文件配置
<mvc:annotation-driven conversion-service="conversionService"/><bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><property name="converters"><set><bean class="com.zhiyou100.mvc.util.DateConverter"/><bean class="com.zhiyou100.mvc.util.SplitString"/></set><!-- <set><bean class="com.zhiyou100.mvc.util.SplitString"/></set> --></property></bean>
拦截器
实现HandlerInterceptor 接口
public class MyInterceptor implements HandlerInterceptor {/*** Handler执行完毕之后执行* 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行* 处理异常,记录日志等*/@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {// TODO Auto-generated method stubSystem.out.println("这是方法执行完毕之后执行");}/*** Handler 方法体中业务代码执行完毕之后,返回ModelAndView之前* 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行* 清理页面已用参数*/@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {// TODO Auto-generated method stubSystem.out.println("这是提交之前执行");}/*** Handler方法执行之前执行,按照配置文件的配置顺序依次执行* 返回true,表示放行 ,false 拦截* 登录拦截,权限认证*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {String path = request.getRequestURI();HttpSession session = request.getSession();if(session.getAttribute("USER_IN_SESSION")==null) {if(path.endsWith("login.do")||path.endsWith("inLogin.do")||path.endsWith("login.jsp")||path.endsWith("regist.do")||path.endsWith("re.do")||path.endsWith("regist.jsp")) {return true;}else {//return false;request.getRequestDispatcher("WEB-INF/page/login.jsp").forward(request, response);}}else{/*if(path.endsWith("login.do")||path.endsWith("inLogin.do")||path.endsWith("login.jsp")||path.endsWith("regist.do")||path.endsWith("re.do")||path.endsWith("regist.jsp")) {return true;}else {return false;}*/}//System.out.println("这是Handler之前执行");return true;}}
拦截器在xml中设置
exclude-mapping path=””
<!-- 配置拦截器--><mvc:interceptors><mvc:interceptor><!-- path:/**表示拦截所有的请求,包括二级以上目录,,/*拦截所有请求,不包括二级以上目录 --><mvc:mapping path="/**"/><!-- 表示配置那些请求不拦截 --><mvc:exclude-mapping path="/user/*"/><bean class="com.zhiyou.mv.controller.MyInterceptor"></bean></mvc:interceptor></mvc:interceptors>
异常处理
定义接口实现 接口HandlerExceptionResolver
public class CustomeExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2,Exception e) {e.printStackTrace();//如果你能够识别异常信息,那么就处理。不能显示未知错误String message = null;if(e instanceof CutomException ) {message = e.getMessage();}else {message="未知错误";}ModelAndView mav = new ModelAndView();mav.addObject("message",message);mav.setViewName("error");return mav;}}
xml配置
<!--配置全局的异常处理bean --><bean class="com.zhiyou.mv.controller.CustomeExceptionHandler"></bean>
事例 登录
throw new CutomException(“ “)
异常需要抛出 try catch 会出错
@RequestMapping("login")public String login(Model model,String name ,String password,HttpSession session) throws Exception {User user = userService.login(name, password);if(user ==null) {throw new CutomException("登录失败");}else {session.setAttribute("USER_IN_SESSION", user);return "forward:list.do";}}
