第二阶段springmvc框架熟悉
来源:互联网 发布:高考语文 知乎 编辑:程序博客网 时间:2024/05/21 05:36
任务产出:学习笔记
1:spring mvc
干什么事情?
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是
帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器
(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现
(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;
提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
怎么干?
1、首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一
个ModelAndView(模型数据和逻辑视图名);
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
4、前端控制器再次收回控制权,将响应返回给用户,至此整个结束。
重要组件:
1.前端控制器:DispatcherServlet(不需要程序员开发)
作用:接受请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet,减少了其他组件之间的耦合度。
2.处理器映射器:HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler。
3.处理适配器HandlerAdapter。
作用:按照特定规则(HandlerAdapter要求的规则)去执行HandlerAdapter
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正常去执行Handler.
4.处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正确执行Handler
5.视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析真正的试图(view)。
6.试图:View(需要程序员开发jsp)
View 是一个接口,实现类支持不同的View类型(jsp,freemarker,pdf....)
基础知识:
@Controller:负责注册一个bean到spring上下文中。
@RequestMapping:为控制器制定可以处理那些URL请求。属性讲解:value即可以处理的URL请求,
URL属性可以具体为三类属性值1:具体指定为普通的值。2:指定为含有某变量的一类值。@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) 3:可以制定含正则表达式的一类值如
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
method制定请求的method类型:get post put delete等。
post 与 get区别:
get方式是将请求携带的参数放在URL的后面,用于信息获取,提交的数据最多只能是1024字节。
post方式是将携带的数据放置在包体中,理论上对数据没有限制,post安全性要比get高。
consumes:处理请求提交的内容类型如:application/json,text/html @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
produces:制定返回的内容类型 @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
params:request中必须包含某些参数,才让该方法处理请求。 @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue") 仅处理请求中名为myParam值为myValue
的请求。
headers:request中的header必须包含某些数据,才让该方法处理请求。 @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/") 仅处理请求头中包含
名为Referer值为http://www.ifeng.com/的请求。
@RequestBody:该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,把数据绑定到controller方法的参数上。
@ResponseBody:通过将controller方法返回的对象,通过适当的HttpMessageConverter进行解析,写到responsebody的body数据区。
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
@RequestParam
在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法。
@PathVariable
绑定 URL 占位符到入参。
@ExceptionHandler
注解到方法上,出现异常时会执行该方法。
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
自动匹配参数:
@RequestMapping("/person")
public String toPerson(String name,double age){
System.out.println(name+" "+age);
return "hello";
}
自动装箱机制:
@RequestMapping("/person1") public String toPerson(Person p){
System.out.println(p.getName()+" "+p.getAge());
return "hello";
}
使用InitBinder来处理Date类型的参数
@RequestMapping("/date") public String date(Date date){
System.out.println(date);
return "hello";
}
//At the time of initialization,convert the type "String" to type "date"
@InitBinder
public void initBinder(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
向前台传递参数,前台可在request作用域中取到p 返回前台页面show.jsp
@RequestMapping("/show")
public String showPerson(Map<String,Object> map){
Person p =new Person();
map.put("p", p);
p.setAge(20);
p.setName("jayjay");
return "show";
}
使用Ajax调用
@RequestMapping("/getPerson")
public void getPerson(String name,PrintWriter pw){
pw.write("hello,"+name);
}
@RequestMapping("/name")
public String sayHello(){
return "name";
}
$(function(){
$("#btn").click(function(){
$.post("mvc/getPerson",{name:$("#name").val()},function(data){
alert(data);
});
});
});
在Controller中使用redirect方式处理请求
@RequestMapping("/redirect")
public String redirect(){
return "redirect:hello";
}
文件上传
1:导入相应jar包
2:在spring mvc配置文件中加入
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="102400000"></property> </bean>
3:方法代码
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(HttpServletRequest req) throws Exception{
MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
MultipartFile file = mreq.getFile("file");
String fileName = file.getOriginalFilename();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
FileOutputStream fos = new FileOutputStream(req.getSession().getServletContext().getRealPath("/")+ "upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')));
fos.write(file.getBytes());
fos.flush();
fos.close();
return "hello";
}
4:表单
<form action="mvc/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br> <input type="submit" value="submit">
</form>
使用@RequestParam注解指定参数的name
@Controller
@RequestMapping("/test")
public class mvcController1 {
@RequestMapping(value="/param")
public String testRequestParam(@RequestParam(value="id") Integer id, @RequestParam(value="name")String name){
System.out.println(id+" "+name);
return "/hello";
}
}
}
RESTFul风格的SringMVC
@Controller @RequestMapping("/rest")
public class RestController {
@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
public String get(@PathVariable("id") Integer id){
System.out.println("get"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.POST)
public String post(@PathVariable("id") Integer id){
System.out.println("post"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
public String put(@PathVariable("id") Integer id){
System.out.println("put"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
System.out.println("delete"+id);
return "/hello";
}
}
前台产生请求:
<form action="rest/user/1" method="post">
<input type="submit" value="post">
</form>
返回json格式的字符串
@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;
}
}
异常的处理
处理局部异常(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";
}
处理全局异常(所有Controller)
@ControllerAdvice
public class testControllerAdvice {
@ExceptionHandler
public ModelAndView exceptionHandler(Exception ex){
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", ex);
System.out.println("in testControllerAdvice");
return mv;
}
}
另一种处理全局异常的方法 在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>
设置一个自定义拦截器
创建一个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;
}
}
在SpringMVC的配置文件中配置
<!-- interceptor setting -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/mvc/**"/>
<bean class="test.SpringMVC.Interceptor.MyInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
表单的验证(使用Hibernate-validate)及国际化
编写实体类User并加上验证注解 @Past表示时间必须是一个过去值
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;
}
在jsp中使用SpringMVC的form表单 path对应name
<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>
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";
}
}
1.因为jsp中使用了modelAttribute属性,所以必须在request域中有一个"user".
2.@Valid 表示按照在实体上标记的注解验证参数
3.返回到原页面错误信息回回显,表单也会回显
错误信息自定义
在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>
国际化显示
在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,切换浏览器语言,能看到账号和密码的语言也切换了。
1:spring mvc
干什么事情?
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是
帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器
(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现
(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;
提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
怎么干?
1、首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一
个ModelAndView(模型数据和逻辑视图名);
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
4、前端控制器再次收回控制权,将响应返回给用户,至此整个结束。
重要组件:
1.前端控制器:DispatcherServlet(不需要程序员开发)
作用:接受请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet,减少了其他组件之间的耦合度。
2.处理器映射器:HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler。
3.处理适配器HandlerAdapter。
作用:按照特定规则(HandlerAdapter要求的规则)去执行HandlerAdapter
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正常去执行Handler.
4.处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正确执行Handler
5.视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析真正的试图(view)。
6.试图:View(需要程序员开发jsp)
View 是一个接口,实现类支持不同的View类型(jsp,freemarker,pdf....)
基础知识:
@Controller:负责注册一个bean到spring上下文中。
@RequestMapping:为控制器制定可以处理那些URL请求。属性讲解:value即可以处理的URL请求,
URL属性可以具体为三类属性值1:具体指定为普通的值。2:指定为含有某变量的一类值。@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) 3:可以制定含正则表达式的一类值如
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
method制定请求的method类型:get post put delete等。
post 与 get区别:
get方式是将请求携带的参数放在URL的后面,用于信息获取,提交的数据最多只能是1024字节。
post方式是将携带的数据放置在包体中,理论上对数据没有限制,post安全性要比get高。
consumes:处理请求提交的内容类型如:application/json,text/html @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
produces:制定返回的内容类型 @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
params:request中必须包含某些参数,才让该方法处理请求。 @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue") 仅处理请求中名为myParam值为myValue
的请求。
headers:request中的header必须包含某些数据,才让该方法处理请求。 @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/") 仅处理请求头中包含
名为Referer值为http://www.ifeng.com/的请求。
@RequestBody:该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,把数据绑定到controller方法的参数上。
@ResponseBody:通过将controller方法返回的对象,通过适当的HttpMessageConverter进行解析,写到responsebody的body数据区。
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
@RequestParam
在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法。
@PathVariable
绑定 URL 占位符到入参。
@ExceptionHandler
注解到方法上,出现异常时会执行该方法。
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
自动匹配参数:
@RequestMapping("/person")
public String toPerson(String name,double age){
System.out.println(name+" "+age);
return "hello";
}
自动装箱机制:
@RequestMapping("/person1") public String toPerson(Person p){
System.out.println(p.getName()+" "+p.getAge());
return "hello";
}
使用InitBinder来处理Date类型的参数
@RequestMapping("/date") public String date(Date date){
System.out.println(date);
return "hello";
}
//At the time of initialization,convert the type "String" to type "date"
@InitBinder
public void initBinder(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
向前台传递参数,前台可在request作用域中取到p 返回前台页面show.jsp
@RequestMapping("/show")
public String showPerson(Map<String,Object> map){
Person p =new Person();
map.put("p", p);
p.setAge(20);
p.setName("jayjay");
return "show";
}
使用Ajax调用
@RequestMapping("/getPerson")
public void getPerson(String name,PrintWriter pw){
pw.write("hello,"+name);
}
@RequestMapping("/name")
public String sayHello(){
return "name";
}
$(function(){
$("#btn").click(function(){
$.post("mvc/getPerson",{name:$("#name").val()},function(data){
alert(data);
});
});
});
在Controller中使用redirect方式处理请求
@RequestMapping("/redirect")
public String redirect(){
return "redirect:hello";
}
文件上传
1:导入相应jar包
2:在spring mvc配置文件中加入
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="102400000"></property> </bean>
3:方法代码
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(HttpServletRequest req) throws Exception{
MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
MultipartFile file = mreq.getFile("file");
String fileName = file.getOriginalFilename();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
FileOutputStream fos = new FileOutputStream(req.getSession().getServletContext().getRealPath("/")+ "upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')));
fos.write(file.getBytes());
fos.flush();
fos.close();
return "hello";
}
4:表单
<form action="mvc/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br> <input type="submit" value="submit">
</form>
使用@RequestParam注解指定参数的name
@Controller
@RequestMapping("/test")
public class mvcController1 {
@RequestMapping(value="/param")
public String testRequestParam(@RequestParam(value="id") Integer id, @RequestParam(value="name")String name){
System.out.println(id+" "+name);
return "/hello";
}
}
}
RESTFul风格的SringMVC
@Controller @RequestMapping("/rest")
public class RestController {
@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
public String get(@PathVariable("id") Integer id){
System.out.println("get"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.POST)
public String post(@PathVariable("id") Integer id){
System.out.println("post"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
public String put(@PathVariable("id") Integer id){
System.out.println("put"+id); return "/hello";
}
@RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
System.out.println("delete"+id);
return "/hello";
}
}
前台产生请求:
<form action="rest/user/1" method="post">
<input type="submit" value="post">
</form>
返回json格式的字符串
@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;
}
}
异常的处理
处理局部异常(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";
}
处理全局异常(所有Controller)
@ControllerAdvice
public class testControllerAdvice {
@ExceptionHandler
public ModelAndView exceptionHandler(Exception ex){
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", ex);
System.out.println("in testControllerAdvice");
return mv;
}
}
另一种处理全局异常的方法 在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>
设置一个自定义拦截器
创建一个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;
}
}
在SpringMVC的配置文件中配置
<!-- interceptor setting -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/mvc/**"/>
<bean class="test.SpringMVC.Interceptor.MyInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
表单的验证(使用Hibernate-validate)及国际化
编写实体类User并加上验证注解 @Past表示时间必须是一个过去值
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;
}
在jsp中使用SpringMVC的form表单 path对应name
<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>
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";
}
}
1.因为jsp中使用了modelAttribute属性,所以必须在request域中有一个"user".
2.@Valid 表示按照在实体上标记的注解验证参数
3.返回到原页面错误信息回回显,表单也会回显
错误信息自定义
在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>
国际化显示
在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,切换浏览器语言,能看到账号和密码的语言也切换了。
阅读全文
0 0
- 第二阶段springmvc框架熟悉
- 第二阶段mybatis框架熟悉
- 第二阶段velocity框架熟悉
- 小菜鸟熟悉下spring+springmvc+mybabits框架
- jquery 熟悉框架开发
- 熟悉列表工具框架
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 如何快速熟悉一个框架?
- SpringMVC框架
- SpringMVC框架
- SpringMVC框架
- SpringMVC框架
- css前端面试题
- 如何解决“app已损坏,打不开。你应该将它移到废纸篓。”
- #ifndef/#define/#endif深刻理解
- ssh远程连接
- SurfaceShader中的那些坑-finalcolor覆盖雾化
- 第二阶段springmvc框架熟悉
- 基准测试的定义(性能测试)
- IntelliJ IDEA For Mac 快捷键
- idea导入spring源码
- 设计模式-状态模式
- Java.io.IOException: open failed: EACCES (Permission denied)
- 图片的宽高设置及背景图片的相关属性
- web开发中,对url键值对的处理。
- webapp开发相关jquery手势事件之jGestures