SpringMVC + Jsp
需要的jar包:

web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myConfig.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
如果没有指定 init-param参数,默认为src路径下dispatcher-servlet.xml文件,即(servlet-name)-servlet.xml配置。
myConfig.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"
xmlns:drools="http://drools.org/schema/drools-spring"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://drools.org/schema/drools-spring classpath:org/drools/container/spring/drools-spring-1.0.0.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/WEB-INF/view/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">LoginAction</prop>
</props>
</property>
</bean>
<bean id="LoginAction" class="com.hammer.login.LoginAction">
<property name="commandClass">
<value>com.hammer.login.LoginInfo</value>
</property>
<property name="fail_view">
<value>loginFail</value>
</property>
<property name="success_view">
<value>main</value>
</property>
</bean>
</beans>
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<String,Object> result = new HashMap<String,Object>();
result.put("loginInfo", loginInfo);
List<String> list = new ArrayList<String>();
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
<body>
<h1>login success!</h1>
<p>Current User:<c:out value="${loginInfo.username}"/></p>
<p>Your current messages:</p>
<c:forEach items="${messages}" var="item" begin="0" end="9" step="1" varStatus="var">
<c:if test="${var.index % 2 == 0}">*</c:if>${item}<br/>
</c:forEach>
</body>
注意: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
<props>节点下可以有多个映射关系存在
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定义
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>showFailure</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="com.hammer.exception.HammerException">showHammerError</prop>
<prop key="com.hammer.exception.SQLException">showSQLError</prop>
</props>
</property>
</bean>
处理单元抛出异常代码:
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配置
<!-- 国际化 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename"><value>messages</value></property>
</bean>
使用时候:<spring:message code="username" />使用在JSP页面中
注意:
属性文件名的写法:
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配置,即是:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver">
</bean>
本国际化实例中 报严重: No WebApplicationContext found: no ContextLoaderListener registered?
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
待解决
200

被折叠的 条评论
为什么被折叠?



