您的位置:首页 > 编程语言 > Java开发

springmvc(二) 控制器Controller及乱码问题和日期问题的解决

2016-04-26 14:47 806 查看
上一篇文章结尾处点了一下映射器和视图解析器http://blog.csdn.net/hnkuo/article/details/51249411

本篇点一下控制器,直接上码

1) org.springframework.web.servlet.mvc.ParameterizableViewController

如果请求是/index.action的请求路径,则直接跳转到/index.jsp页面,不经过程序员定义的控制器Action

<!-- 专用于jsp到jsp/html的转发控制器 -->
<bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<!-- 转发到真实视图名 -->
<property name="viewName" value="/index.jsp"/>
</bean>
2)    org.springframework.web.servlet.mvc.AbstractCommandController

能够以实体的形式,收集客户端参数

前端页面:
<form action="${pageContext.request.contextPath}/add.action" method="POST">
<table border="2" align="center">
<tr>
<th>姓名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<th>性别</th>
<td>
<input type="radio" name="gender" value="男"/>男
<input type="radio" name="gender" value="女" checked/>女
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>

Action处理类:
/**
* 单例
* 处理类
* @author AdminTC
*/
@SuppressWarnings("deprecation")
public class EmpAction extends AbstractCommandController{
public EmpAction(){
//将表单参数封装到Emp对象中去
this.setCommandClass(Emp.class);
}
/**
* obj表示封装后的实体
* error表示封装时产生的异常
*/
@Override
protected ModelAndView handle(
HttpServletRequest request,
HttpServletResponse response,
Object obj,
BindException error)throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message","增加员工成功");
Emp emp = (Emp) obj;
//将Emp封装到ModeAndView对象中
modelAndView.addObject("emp",emp);
modelAndView.setViewName("/jsp/success.jsp");
return modelAndView;
}
}

Emp实体:
public class Emp {
private String username;//姓名
private String gender;//性别
//set、get方法省略
}
<span style="white-space:pre">	</span><!-- 注册Action -->
<span style="white-space:pre">	</span><bean name="/add.action" class="cn.itcast.javaee.springmvc.app10.EmpAction"></bean>
<span style="white-space:pre">		</span>
<span style="white-space:pre">	</span><!-- 映射器 (可不写)-->
    <span style="white-space:pre">	</span><!-- 适配器(SimpleControllerHandlerAdapter去找实现了Controller接口的Action,也能去找继承了AbstractCommandController类的Action,...)可不写-->
<span style="white-space:pre">	</span><!-- 视图解析器 (可不写)-->


success.jsp页面获取:
${requestScope.message}<br/>
姓名:${requestScope.emp.username}<br/>
性别:${requestScope.emp.gender}<br/>

注册spring提供的针对POST请求的中文乱码问题    web.xml中添加
<span style="white-space:pre">	</span><filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

若前端页面有日期,例如本例增加员工入职日期,则需在action处理类中自定义类型转换器,将String->Date类型(格式yyyy-MM-dd):
在EmpAction 中覆写initBinder方法:

/**
* 自定义类型转换器,将String->Date类型(格式yyyy-MM-dd)
*/
@Override
protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
//向springmvc内部注入一个自定义的类型转换器
//参数一:将String转成什么类型的字节码
//参数二:自定义转换规则
//true表示该日期字段可以为空
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}注:在Emp实体中添加入职时间属性private Date hiredate;

将入职时间显示到success.jsp页面中,若要格式化日期,则添加如下代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
入职时间:<fmt:formatDate
value="${requestScope.emp.hiredate}"
type="date"
dateStyle="medium"
/>
<!--
1)fmt:formatDate 来源于 http://java.sun.com/jsp/jstl/fmt 2)fmt:formatDate作用是格式化日期的显示,例如:2015年5月10日 星期日
3)value表示需要格式化的值
4)type表示显示日期,时间,都显示
type=date表示只显示日期
type=time表示只显示时间
type=both表示日期时间均显示
5)dateStyle表示显示日期的格式:short/medium/default/long/full
-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc