SpringMVC + Jsp
需要的jar包:
web.xml配置文件
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/myConfig.xml
dispatcher
*.do
如果没有指定 init-param参数,默认为src路径下dispatcher-servlet.xml文件,即(servlet-name)-servlet.xml配置。
myConfig.xml配置
org.springframework.web.servlet.view.JstlView
/WEB-INF/view/
.jsp
LoginAction
com.hammer.login.LoginInfo
loginFail
main
LoginAction.java
package com.hammer.login;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
@SuppressWarnings("deprecation")
public class LoginAction extends SimpleFormController{
private String fail_view;
private String success_view;
@Override
protected ModelAndView onSubmit(Object command, BindException errors)
throws Exception {
LoginInfo loginInfo = (LoginInfo)command;
if(login(loginInfo) == 0){
HashMap result = new HashMap();
result.put("loginInfo", loginInfo);
List list = new ArrayList();
list.add("msg1");
list.add("msg2");
list.add("msg3");
result.put("messages", list);
return new ModelAndView(this.getSuccess_view(),result);
}
return new ModelAndView(this.getFail_view());
}
private int login(LoginInfo info){
if("hammer".equals(info.getUsername()) && "hammer".equals(info.getPassword())){
return 0;
}
return 1;
}
public String getFail_view() {
return fail_view;
}
public void setFail_view(String fail_view) {
this.fail_view = fail_view;
}
public String getSuccess_view() {
return success_view;
}
public void setSuccess_view(String success_view) {
this.success_view = success_view;
}
}
LoginInfo.java
package com.hammer.login;
public class LoginInfo {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Main.jsp
login success!
Current User:
Your current messages:
* ${item}
注意:JSTL的使用 Spring3.0以上的SimpleFormController 过时
1、Resolver设定
Resolver将输出结果和输出界面相融合,为表现层提供呈现资源。
2、View Resolver的viewClass参数
使用JSP页面作为输出,因此,设定为:
org.springframework.web.servlet.view.JstlView
如果是FreeMarker模板表现层:
org.springframework.web.servlet.view.freemarker.FreeMarkerView
如果是Velocity模板表现层
org.springframework.web.servlet.view.velocity.VelocityView
3、View Resolver的prefix前缀参数
运行时,Spring将为指定的页面资源自动追加前缀
4、View Resolver的suffi前缀x参数
运行时,Spring将为指定的页面资源自动追加后缀
5、“请求/处理单元”关系映射
将“login.do”映射到处理单元 LoginAction
6、LoginAction定义具体实现类
7、LoginAction的请求数据参数
commandClass参数源于LoginAction的基类BaseCommandController包含了请求数据的封装和验证方法BaseCommandController.bindAndValidate,将传入的HttpServletRequest构造请求数据对象,LoginInfo这是一个简单的JavaBean,对Http请求的参数进行遍历,于LoginInfo存在相同名称的属性,如果找到,则将此参数复制到LoginInfo对象的同名属性中,后作为参数传递给LoginAction.
8、返回视图定义
返回结果对应我们配置了fail_view、success_view两个自定义参数。参数值将由Resolver进行处理,为其加上前缀后缀,如对于fail_view对应的页面路径/WEB-INF/view/loginFail.jsp之后,Resolver会将LoginAction的返回数据与视图相融合,返回最终的显示界面。
探讨: BindException 的数据绑定错误的跟踪机制,错误描述的工具,用于向上层反馈的错误信息。
统一异常处理
修改myConfig.xml增加exceptionResolver定义
showFailure
showHammerError
showSQLError
处理单元抛出异常代码:
public void throwException(LoginInfo info) throws Exception{
if("sql".equals(info.getUsername())){
throw new SQLException();
}else if("ham".equals(info.getUsername())){
throw new HammerException();
}
throw new Exception();
}
映射到对应的处理页面,抛出SQLException,跳转到showSQLError.jsp(页面可以展示Exception的message信息等)页面 根据exceptionMappings关系。
思考针对业务异常分类,以弹出框的形式展示 业务信息需求,后台怎么统一搞(编写异常处理工具类,信息通过Ajax异步结果集传递)
国际化支持
在myConfig.xml增加messageSource配置
messages
使用时候:
注意:
属性文件名的写法:
messages_zh_CN.properties (中文) 部署的时候使用JDK的native2ascii转码
messages_en_US.properties (英文)
配置messageSource这个bean(注意:一定是messageSource不是messageResource ,这是Spring规定的)
Locale的切换:
1、根据语言种类,部署时候手动替换*.properties文件
2、根据当前系统的Locale设置,自动匹配(上列默认)
3、根据客户浏览器语言设定,自动切换界面语种,最灵活
注意:AcceptHeaderLocaleResolver、SessionLocaleResolver、CookieLocaleResolver使用
在myConfig.xml中增加localeResolver配置,即是:
本国际化实例中 报严重: No WebApplicationContext found: no ContextLoaderListener registered?
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
待解决