spring mvc学习中遇到的问题及解决办法

时间:2022-01-26 13:41:37

1.框架搭建方面

   和搭建ssh等开发环境步骤基本一致,无需额外注意什么,struts2是通过filter的方式拦截所有客户端的请求,spring mvc是通过一个自动装载的servlet来拦截,一定要说注意的点的话就是struts2是拦截所有的请求,写法如下:

  1. <filter-mapping> 
  2.     <filter-name>struts2</filter-name> 
  3.     <url-pattern>/*</url-pattern> 
  4. </filter-mapping> 
 

 

spring mvc的配置为拦截/的请求,如下:

  1. <servlet-mapping> 
  2.     <servlet-name>spring3</servlet-name> 
  3.     <!-- 这里可以用 / 但不能用 /* ,拦截了所有请求会导致静态资源无法访问,所以要在spring3-servlet.xml中配置mvc:resources --> 
  4.     <url-pattern>/</url-pattern> 
  5. </servlet-mapping>   
 

 

2.如何接收前台提交的数据?

 

spring mvc与struts2的最大区别就在这里,struts2的action方法都是无参数的,接收客户端提交的数据一般都是在action类定义实体类实例的方式来实现的,spring mvc则主要是通过定义action 方法参数来接收,这个搞struts2开发的程序员还真是需要适应一下,记住,取客户端提交的东西通过定义方法参数来获取!

 

具体怎么接收呢?假设有以下实体类

  1. package com.shinowit.web; 
  2.  
  3. import java.io.Serializable; 
  4. import java.util.Date; 
  5.  
  6. publicclass UserInfo implements Serializable{ 
  7.  
  8.     privatestaticfinallong serialVersionUID = 1L; 
  9.     private String userName; 
  10.     private String userPass; 
  11.     privateint age; 
  12.     private Date birthday; 
  13.     privatefloat price; 
  14.     privatebyte status; 
  15.     privateboolean valid; 
  16.      
  17.      
  18.      
  19.     public String getUserName() { 
  20.         return userName; 
  21.     } 
  22.     publicvoid setUserName(String userName) { 
  23.         this.userName = userName; 
  24.     } 
  25.     public String getUserPass() { 
  26.         return userPass; 
  27.     } 
  28.     publicvoid setUserPass(String userPass) { 
  29.         this.userPass = userPass; 
  30.     } 
  31.     publicint getAge() { 
  32.         return age; 
  33.     } 
  34.     publicvoid setAge(int age) { 
  35.         this.age = age; 
  36.     } 
  37.     public Date getBirthday() { 
  38.         return birthday; 
  39.     } 
  40.     publicvoid setBirthday(Date birthday) { 
  41.         this.birthday = birthday; 
  42.     } 
  43.     publicfloat getPrice() { 
  44.         return price; 
  45.     } 
  46.     publicvoid setPrice(float price) { 
  47.         this.price = price; 
  48.     } 
  49.     publicbyte getStatus() { 
  50.         return status; 
  51.     } 
  52.     publicvoid setStatus(byte status) { 
  53.         this.status = status; 
  54.     } 
  55.     publicboolean isValid() { 
  56.         return valid; 
  57.     } 
  58.     publicvoid setValid(boolean valid) { 
  59.         this.valid = valid; 
  60.     } 
  61.      
 

前台的输入录入界面hello.jsp关键代码为:

 

  1. <%@ taglib prefix="spring"uri="http://www.springframework.org/tags"%> 
  2. <%@ taglib prefix="form"uri="http://www.springframework.org/tags/form" %> 
  3.  
  4.     <form:formaction="./test/hello1.do"method="post"modelAttribute="user"> 
  5.      username:<form:inputpath="userName"/><form:errorspath="userName"/> 
  6.      password:<form:passwordpath="userPass"/> 
  7.      age:<form:inputpath="age"/><form:errorspath="age"></form:errors> 
  8.      birthday:<form:inputpath="birthday"/><form:errorspath="birthday"></form:errors> 
  9.      <inputtype="submit"value="login"> 
  10.     </form:form> 
 

spring mvc中接收的代码则为:

 

  1. @RequestMapping(value="hello1",method=RequestMethod.POST) 
  2. public ModelAndView saveHello(@ModelAttribute("user") UserInfo user,BindingResult bindingResult){ 
  3.      
  4.     ModelAndView result=new ModelAndView("hello"); 
  5.      
  6.     if (bindingResult.hasErrors()==false){ 
  7.         if (user.getAge()<10){ 
  8.             bindingResult.rejectValue("age", "","年龄不能小于十岁!"); 
  9.         } 
  10.     } 
  11.     return result; 
	

上面的代码少TMD的一个字都会有问题啊,里面的几个重点:

 

1.BindingResult 参数前面必须要有用@ModelAttribute修饰的参数,一般就是实体类了,另外,必须必须的要起个名字,这个名字一定要和前台的

  1. <form:formaction="./test/hello1.do"method="post"modelAttribute="user"> 

这里面的modelAttribute名称一样。

 

 

2.前台的

  1. <form:errorspath="age"></form:errors> 

如果有类型转换错误时,比如int类型的age用户错误的输入了字符串时,需要定义全局的国际化资源文件来搞定,如下:

 

spring的配置参数文件中定义加载国际化资源文件

  1. <beanid="messageSource"   
  2.       class="org.springframework.context.support.ResourceBundleMessageSource">   
  3.     <propertyname="basename"value="messages"/>   
  4.     </bean>  
 	

然后编写messages.properties文件,内容如下:

 

  1. typeMismatch.java.util.Date={0} \u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u65E5\u671F. 
  2. typeMismatch.int={0} \u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u6570\u5B57. 

然后在界面上使用<form:errors path="xxx">输出spring mvc的类型转换错误消息时才会好看,要不然就是一大堆E文提示,这玩意折腾了两天的时间才知道如何搞定。

 

另外就是需要写一写类型转换器,比如针对Date类型的,代码如下:

  1. package com.shinowit.util; 
  2.  
  3. import java.beans.PropertyEditorSupport; 
  4. import java.text.ParseException; 
  5. import java.text.SimpleDateFormat; 
  6. import java.util.Calendar; 
  7. import java.util.Date; 
  8.  
  9. import org.springframework.util.StringUtils; 
  10.  
  11. publicclass DateConvertEditor extends PropertyEditorSupport { 
  12.     private SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  13.     private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
  14.  
  15.     publicvoid setAsText(String text) throws IllegalArgumentException { 
  16.         if (StringUtils.hasText(text)) { 
  17.             try
  18.                 if (text.indexOf(":") == -1 && text.length() == 10) { 
  19.                     setValue(this.dateFormat.parse(text)); 
  20.                 } elseif (text.indexOf(":") > 0 && text.length() == 19) { 
  21.                     setValue(this.datetimeFormat.parse(text)); 
  22.                 }else
  23.                     thrownew IllegalArgumentException("Could not parse date, date format is error "); 
  24.                 } 
  25.             } catch (ParseException ex) { 
  26.                 IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage()); 
  27.                 iae.initCause(ex); 
  28.                 throw iae; 
  29.             } 
  30.         } else
  31.             setValue(null); 
  32.         } 
  33.     } 
  34.      
  35.     public String getAsText() { 
  36.         if (getValue() instanceof java.util.Date) { 
  37.             try
  38.                 Calendar cal=Calendar.getInstance(); 
  39.                 Date dateValue=(Date)getValue(); 
  40.                 cal.setTimeInMillis(dateValue.getTime()); 
  41.                 if ((0==cal.get(Calendar.HOUR_OF_DAY)) && (0==cal.get(Calendar.MINUTE)) && (0==cal.get(Calendar.SECOND))){ 
  42.                     return dateFormat.format(dateValue); 
  43.                 }else
  44.                     return datetimeFormat.format(dateValue); 
  45.                 } 
  46.             }catch(Exception e){ 
  47.                 e.printStackTrace(); 
  48.             } 
  49.         } 
  50.         return""
  51.    }     
 

针对int类型的

 

  1. package com.shinowit.util; 
  2.  
  3. import java.beans.PropertyEditorSupport; 
  4.  
  5. import org.springframework.util.StringUtils; 
  6.  
  7. publicclass IntConvertEditor extends PropertyEditorSupport { 
  8.  
  9.     publicvoid setAsText(String text) throws IllegalArgumentException { 
  10.         if (StringUtils.hasText(text)) { 
  11.             try
  12.                 setValue(Integer.parseInt(text)); 
  13.             } catch (Exception ex) { 
  14.                 IllegalArgumentException iae = new IllegalArgumentException("Could not parse int data,message: " + ex.getMessage()); 
  15.                 iae.initCause(ex); 
  16.                 throw iae; 
  17.             } 
  18.         } else
  19.             setValue(0); 
  20.             //setValue(null); 
  21.         } 
  22.     } 
  23.      
  24.     public String getAsText(){ 
  25.         if (getValue() instanceof java.lang.Integer) { 
  26.             Integer value=(Integer)getValue(); 
  27.             return value.toString(); 
  28.         } 
  29.         return""
  30.     } 

http://blog.csdn.net/peihexian/article/details/7168729