网站首页 文章专栏 SpringMVC学习笔记(二)
SpringMVC学习笔记(二)


十三、返回json格式的字符串


1.导入以下jar包

2.方法代码


@Controller
@RequestMapping("/json")public class jsonController {
   
   @ResponseBody
   @RequestMapping("/user")  
    public  User get(){
       User u = new User();
       u.setId(1);
       u.setName("jayjay");
       u.setBirth(new Date());        
       return u;
   }
}


十四、异常的处理


1.处理局部异常(Controller内)


    @ExceptionHandler    
   public ModelAndView exceptionHandler(Exception ex){
       ModelAndView mv = new ModelAndView("error");
       mv.addObject("exception", ex);
       System.out.println("in testExceptionHandler");        
       return mv;
   }
   
   @RequestMapping("/error")    
   public String error(){        
       int i = 5/0;        
       return "hello";
   }


2.处理全局异常(所有Controller)


@ControllerAdvicepublic class testControllerAdvice {
   @ExceptionHandler    
   public ModelAndView exceptionHandler(Exception ex){
       ModelAndView mv = new ModelAndView("error");
       mv.addObject("exception", ex);
       System.out.println("in testControllerAdvice");        
       return mv;
   }
}


3.另一种处理全局异常的方法

在SpringMVC配置文件中配置


    <!-- configure SimpleMappingExceptionResolver -->
   <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <property name="exceptionMappings">
           <props>
               <prop key="java.lang.ArithmeticException">error</prop>
           </props>
       </property>
   </bean>

error是出错页面


十五、设置一个自定义拦截器


1.创建一个MyInterceptor类,并实现HandlerInterceptor接口


public class MyInterceptor implements HandlerInterceptor {
   @Override    
   public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
       System.out.println("afterCompletion");
   }
   @Override    
   public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception {
       System.out.println("postHandle");
   }
   @Override    
   public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws Exception {
       System.out.println("preHandle");        return true;
   }
}


2.在SpringMVC的配置文件中配置


    <!-- interceptor setting -->
   <mvc:interceptors>
       <mvc:interceptor>
           <mvc:mapping path="/mvc/**"/>
           <bean class="test.SpringMVC.Interceptor.MyInterceptor"></bean>
       </mvc:interceptor>        
   </mvc:interceptors>


3.拦截器执行顺序


springmvc.png


十六、表单的验证(使用Hibernate-validate)及国际化


1.导入Hibernate-validate需要的jar包

(未选中不用导入)

2.编写实体类User并加上验证注解


public class User {    
public int getId() {        
return id;
   }    
   public void setId(int id) {      
    this.id = id;
   }    
   public String getName() {        
   return name;
   }    
   public void setName(String name) {        
   this.name = name;
   }    
   public Date getBirth() {        
   return birth;
   }    
   public void setBirth(Date birth) {        
   this.birth = birth;
   }
   @Override    p
   ublic String toString() {        
   return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]";
   }    
   private int id;
   @NotEmpty    
   private String name;
   @Past
   @DateTimeFormat(pattern="yyyy-MM-dd")  
    private Date birth;
}


ps:@Past表示时间必须是一个过去值


3.在jsp中使用SpringMVC的form表单


    <form:form action="form/add" method="post" modelAttribute="user">
       id:<form:input path="id"/><form:errors path="id"/><br>
       name:<form:input path="name"/><form:errors path="name"/><br>
       birth:<form:input path="birth"/><form:errors path="birth"/>
       <input type="submit" value="submit">
   </form:form>


ps:path对应name


4.Controller中代码


@Controller
@RequestMapping("/form")public class formController {
   @RequestMapping(value="/add",method=RequestMethod.POST)    
   public String add(@Valid User u,BindingResult br){        
   if(br.getErrorCount()>0){            
           return "addUser";
       }        
       return "showUser";
   }
   
   @RequestMapping(value="/add",method=RequestMethod.GET)    
   public String add(Map<String,Object> map){
       map.put("user",new User());        
       return "addUser";
   }
}


ps:

  1.因为jsp中使用了modelAttribute属性,所以必须在request域中有一个"user".

  2.@Valid 表示按照在实体上标记的注解验证参数

  3.返回到原页面错误信息回回显,表单也会回显

    4.错误信息自定义在src目录下添加locale.properties


NotEmpty.user.name=name can't not be empty
Past.user.birth=birth should be a past value
DateTimeFormat.user.birth=the format of input is wrong
typeMismatch.user.birth=the format of input is wrong
typeMismatch.user.id=the format of input is wrong


在SpringMVC配置文件中配置


    <!-- configure the locale resource -->
   <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
       <property name="basename" value="locale"></property>
   </bean>


6.国际化显示

在src下添加locale_zh_CN.properties

username=账号
password=密码


locale.properties中添加


username=user name
password=password


创建一个locale.jsp


  <body>
   <fmt:message key="username"></fmt:message>
   <fmt:message key="password"></fmt:message>
 </body>


在SpringMVC中配置


    <!-- make the jsp page can be visited -->
   <mvc:view-controller path="/locale" view-name="locale"/>

让locale.jsp在WEB-INF下也能直接访问

最后,访问locale.jsp,切换浏览器语言,能看到账号和密码的语言也切换了


十七、压轴大戏--整合SpringIOC和SpringMVC


1.创建一个test.SpringMVC.integrate的包用来演示整合,并创建各类

2.User实体类


public class User {   
   public int getId() {        
       return id;
   }    
   public void setId(int id) {        
       this.id = id;
   }    
   public String getName() {        
       return name;
   }    
   public void setName(String name) {        
       this.name = name;
   }    
   public Date getBirth() {        
       return birth;
   }    
   public void setBirth(Date birth) {      
       this.birth = birth;
   }
   @Override    
   public String toString() {        
       return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]";
   }    
   private int id;
   @NotEmpty    
   private String name;
   @Past
   @DateTimeFormat(pattern="yyyy-MM-dd")    
   private Date birth;
}


3.UserService类


 "UserService Constructor...\n\n\n\n\n\n" "save"


4.UserController


@Controller
@RequestMapping("/integrate")public class UserController {
   @Autowired    
   private UserService userService;
   
   @RequestMapping("/user")    
   public String saveUser(@RequestBody @ModelAttribute User u){
       System.out.println(u);
       userService.save();        
       return "hello";
   }
}


5.Spring配置文件

在src目录下创建SpringIOC的配置文件applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       "
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"    
       >
   <context:component-scan base-package="test.SpringMVC.integrate">
       <context:exclude-filter type="annotation"
           expression="org.springframework.stereotype.Controller"/>
       <context:exclude-filter type="annotation"
           expression="org.springframework.web.bind.annotation.ControllerAdvice"/>        
   </context:component-scan>
   </beans>


在Web.xml中添加配置


  <!-- configure the springIOC -->
 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>  
   <param-name>contextConfigLocation</param-name>  
   <param-value>classpath:applicationContext.xml</param-value>
 </context-param>


6.在SpringMVC中进行一些配置,防止SpringMVC和SpringIOC对同一个对象的管理重合


<!-- scan the package and the sub package -->
   <context:component-scan base-package="test.SpringMVC.integrate">
       <context:include-filter type="annotation"
           expression="org.springframework.stereotype.Controller"/>
       <context:include-filter type="annotation"
           expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
   </context:component-scan>


十八、SpringMVC详细运行流程图


springmvc.png


十九、SpringMVC运行原理


1. 客户端请求提交到DispatcherServlet
    2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
    3. DispatcherServlet将请求提交到Controller
    4. Controller调用业务逻辑处理后,返回ModelAndView
    5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
    6. 视图负责将结果显示到客户端


二十、SpringMVC与struts2的区别


1、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。
    2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
    3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

传送门:SpringMVC学习笔记(一)





赞助本站,网站的发展离不开你们的支持!
来说两句吧
最新评论