史上最全最强SpringMVC详细示例实战教程(二)
史上最全最强SpringMVC详细示例实战教程(二)
IT IT哈哈
十四、异常的处理
1.处理局部异常(Controller内)
@ExceptionHandlerpublic 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.拦截器执行顺序
十六、表单的验证(使用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 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;}
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.返回到原页面错误信息回回显,表单也会回显
5.错误信息自定义
在src目录下添加locale.properties
NotEmpty.user.name=name can't not be emptyPast.user.birth=birth should be a past valueDateTimeFormat.user.birth=the format of input is wrongtypeMismatch.user.birth=the format of input is wrongtypeMismatch.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 namepassword=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类
@Componentpublic class UserService { public UserService(){ System.out.println("UserService Constructor...\n\n\n\n\n\n"); } public void save(){ System.out.println("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与struts2的区别
1、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。
2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。
更多相关文章
- 史上最全最强SpringMVC详细示例实战教程(一)
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(07) 范式与反模
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(06) 数据库安全
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(05) 索引的排序
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(04) 索引使用的
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(03) 如何设计索
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(01)数据类型的
- 服务端开发指南与最佳实战 | 数据存储技术 | MySQL(02) 存储引擎的
- Spring Boot 揭秘与实战 工作原理剖析