一种基于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:需要转换的目标数据类型
*/
@Override
public 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 block
e.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执行完毕之后执行
* 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行
* 处理异常,记录日志等
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是方法执行完毕之后执行");
}
/**
* Handler 方法体中业务代码执行完毕之后,返回ModelAndView之前
* 如果配置多个拦截器,那么会按照配置文件的配置顺序的逆序执行
* 清理页面已用参数
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是提交之前执行");
}
/**
* Handler方法执行之前执行,按照配置文件的配置顺序依次执行
* 返回true,表示放行 ,false 拦截
* 登录拦截,权限认证
*/
@Override
public 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 {
@Override
public 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";
}
}