springmvc参数传递 mybtis怎么传递一个段时间查询

SpringMVC3.0+MyIbatis3.0(分页示例) - 咫尺天涯 - ITeye博客
博客分类:
参考资料
1 ibatis2.x与mybatis(ibatis3.x)的比较
2 MyBatis学习 之 三、动态SQL语句
主要使用Oracle的三层sql实现分页!
一 环境:XP3+Oracle10g+MyEclipse6+(Tomcat)+JDK1.5
二 工程相关图片:
1 DEMO图片
2 工程代码图片
3 相关jar包图片
三 此示例是在:
SSI:SpringMVC3+Mybatis3(登录及CRUD操作)基础上加的分页功能:
四 主要代码文件
1 BaseController.java用于子类调用方便
package com.liuzd.ssm.
import javax.servlet.http.HttpServletR
import com.liuzd.page.P
import com.liuzd.page.PageS
import com.liuzd.page.PageU
*Description:
*Copyright: Copyright (c) 2011
*Company:/
*Makedate: 下午03:31:03
* @author liuzidong
* @version 1.0
* @since 1.0
public class BaseController {
* oracel的三层分页语句
* 子类在展现数据前,进行分页计算!
* @param totalCount 根据查询SQL获取的总条数
* @param columnNameDescOrAsc 列名+排序方式 : ID DESC or ASC
protected Page executePage(HttpServletRequest request,Long totalCount){
if(null == totalCount){
totalCount = 0L;
/**页面状态,这个状态是分页自带的,与业务无关*/
String pageAction = request.getParameter("pageAction");
String value = request.getParameter("pageKey");
/**获取下标判断分页状态*/
int index = PageState.getOrdinal(pageAction);
Page page =
* index & 1 只有二种状态
* 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1
* 2 当页面设置每页显示多少条: index=0,当每页显示多少条时,分页类要重新计算
Page sessionPage = getPage(request);
if(index & 1){
page = PageUtil.inintPage(totalCount,index,value,sessionPage);
page = PageUtil.execPage(index,value,sessionPage);
setSession(request,page);
private Page getPage(HttpServletRequest request) {
Page page = (Page)request.getSession().getAttribute(PageUtil.SESSION_PAGE_KEY);
if(page == null){
page = new Page();
private void setSession(HttpServletRequest request,Page page) {
request.getSession().setAttribute(PageUtil.SESSION_PAGE_KEY,page);
2 UserController.java
package com.liuzd.ssm.
import java.util.HashM
import java.util.L
import java.util.M
import javax.annotation.R
import javax.servlet.http.HttpServletR
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.PathV
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.SessionA
import org.springframework.web.servlet.ModelAndV
import com.liuzd.page.P
import com.liuzd.ssm.entity.U
import com.liuzd.ssm.service.UserS
@Controller
@RequestMapping("/user")
@SessionAttributes("userList")
public class UserController extends BaseController{
private UserService userS
public UserService getUserService() {
return userS
public void setUserService(UserService userService) {
this.userService = userS
@RequestMapping("/userList")
public ModelAndView userList(HttpServletRequest request){
Map&String,Object& params = new HashMap&String,Object&();
//添加查询条件
// ... params.put("name","jack");...
//获取总条数
Long totalCount = this.getUserService().pageCounts(params);
//设置分页对象
Page page = executePage(request,totalCount);
if(page.isSort()){
params.put("orderName",page.getSortName());
params.put("descAsc",page.getSortState());
//没有进行排序,默认排序方式
params.put("orderName","age");
params.put("descAsc","asc");
//压入查询参数:开始条数与结束条灵敏
params.put("startIndex", page.getBeginIndex());
params.put("endIndex", page.getEndinIndex());
ModelAndView mv = new ModelAndView();
//查询集合
List&User& users = this.getUserService().pageList(params);
mv.addObject("userList",users);
mv.setViewName("userList");
3 UserMapper.java
package com.liuzd.ssm.
import java.util.L
import java.util.M
import org.apache.ibatis.session.RowB
import com.liuzd.ssm.entity.U
public interface UserMapper{
public List&User& pageList(Map&String,Object& params);
//分页总条数
public Long pageCounts(Map&String,Object& p);
4 UserMapper.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"&
&mapper namespace="com.liuzd.ssm.mapper.UserMapper"&
&resultMap type="com.liuzd.ssm.entity.User" id="userMap"&
&id property="id" column="id"/&
&result property="name" column="name"/&
&result property="age" column="age"/&
&result property="sex" column="sex"/&
&result property="address" column="address"/&
&result property="password" column="password"/&
&/resultMap&
&select id="pageList" parameterType="map" resultType="list" resultMap="userMap"&
select ttt.* from(select tt.*,rownum rn from(select * from users
&if test="name != null and name != ''"&
特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。
在开发时使用: $,方便调试sql,发布时使用: #
and name like #{name},
and name like '%${name}%'
&if test="sex != null and sex != ''"&
and sex = #{sex}
order by ${orderName} ${descAsc} )tt)ttt
&if test="startIndex != null and startIndex != ''"&
rn & ${startIndex}
&if test="endIndex != null and endIndex != ''"&
&![CDATA[ and rn &= ${endIndex}
&select id="pageCounts" parameterType="map" resultType="long"&
select count(*) from users
&if test="name != null and name != ''"&
and name like #{name}
&if test="sex != null and sex != ''"&
and sex = #{sex}
5 userList.jsp
&%@ page language="java" pageEncoding="UTF-8" contentType="text/ charset=UTF-8"%&
&%@ taglib uri="/WEB-INF/c.tld" prefix="c"%&
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&
&%@ include file="/common/meta.jsp"%&
&table width="60%" border="1" cellpadding="0" align="center"&
&th style="cursor:" title="按姓名进行排序" onclick="sortPage('name')" valign="top"&
姓名&font color='red'&${page.sortName eq "name" ? page.sortInfo : page.defaultInfo}&/font&
&th style="cursor:" title="按年龄进行排序" onclick="sortPage('age')" valign="top"&
年龄&font color='red'&${page.sortName eq "age" ? page.sortInfo : page.defaultInfo}&/font&
&th style="cursor:" title="按性别进行排序" onclick="sortPage('sex')" valign="top"&
性别&font color='red'&${page.sortName eq "sex" ? page.sortInfo : page.defaultInfo}&/font&
&th style="cursor:" title="按地址进行排序" onclick="sortPage('address')" valign="top"&
地址&font color='red'&${page.sortName eq "address" ? page.sortInfo : page.defaultInfo}&/font&
&th style="cursor:" &
&c:forEach items="${userList}" var="user"&
&tr align="center"&
${user.name}
${user.age}
${user.sex eq 1 ? "男" : user.sex eq 2 ? "女" : "未知"}
${user.address}
href="${pageContext.request.contextPath}/user/toAddUser.do"&添加&/a&
href="${pageContext.request.contextPath}/user/getUser/${user.id}.do"&编辑&/a&
href="${pageContext.request.contextPath}/user/delUser/${user.id}.do"&删除&/a&
&/c:forEach&
&jsp:include page="/page/page.jsp"&
&jsp:param name="url" value="user/userList.do" /&
&/jsp:include&
&a href="${pageContext.request.contextPath}/index.jsp"&返回&/a&
6 page.jsp,此页面你不用关心,只管引用就行了
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&%@ taglib uri="/WEB-INF/c.tld" prefix="c"%&
&c:set var="page" value="${sessionScope.page}" /&
&c:set var="path" value="${pageContext.request.contextPath}" /&
&c:set var="url" value="${param.url}" /&
&c:set var="urlParams" value="${param.urlParams}" /&
&c:set var="pathurl" value="${path}/${url}" /&
&td colspan="5"&
共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条
当前第${page.currentPage}页&
&c:choose&
&c:when test="${page.hasPrePage eq false}"&
&lt&lt首页&&lt上页&
&c:otherwise&
&a href="${pathurl}?&pageAction=first${urlParams}"&&lt&lt首页&&/a&&
&a href="${pathurl}?pageAction=previous${urlParams}" /&&lt上一页&/a&
&/c:otherwise&
&/c:choose&
&c:choose&
&c:when test="${page.hasNextPage eq false}"&
&下页&gt&尾页&gt&gt
&c:otherwise&
&a href="${pathurl}?&pageAction=next${urlParams}"&下一页&gt&&/a&&
&a href="${pathurl}?pageAction=last${urlParams}" /&末页&gt&gt&/a&
&/c:otherwise&
&/c:choose&
&SELECT name="indexChange" id="indexChange"
onchange="getCurrentPage(this.value);"&
&c:forEach var="index" begin="1" end="${page.totalPage}" step="1"&
&option value="${index}" ${page.currentPage eq index ? "selected" : ""}&
第${index}页
&/c:forEach&
每页显示:&select name="everyPage" id="everyPage" onchange="setEveryPage(this.value);"&
&c:forEach var="pageCount" begin="5" end="${page.totalCount}" step="5"&
&option value="${pageCount}" ${page.everyPage eq pageCount ? "selected" : ""}&
${pageCount}条
&/c:forEach&
&div style='display: none'&
&a class=listlink id="indexPageHref" href='#'&&/a&
function getCurrentPage(index){
var a = document.getElementById("indexPageHref");
a.href = '${pathurl}?pageAction=gopage&pageKey='+index+'${urlParams}';
a.setAttribute("onclick",'');
a.click("return false");
function setEveryPage(everyPage){
var a = document.getElementById("indexPageHref");
var currentPage = document.getElementById('indexChange').
a.href = '${pathurl}?pageAction=setpage&pageKey='+everyPage+'${urlParams}';
a.setAttribute("onclick",'');
a.click("return false");
function sortPage(sortName){
var a = document.getElementById("indexPageHref");
a.href = '${pathurl}?pageAction=sort&pageKey='+sortName+'${urlParams}';
a.setAttribute("onclick",'');
a.click("return false");
下载次数: 1939
下载次数: 895
下载次数: 1086
浏览 35477
浏览: 1610175 次
来自: 成都
非常赞!代码很清楚
分页写得不对,应该是 : order by ${orderNa ...
包在哪里啊最近在做bootstrap 分页给大家分享一下& &页面效果如下:&pre name=&code& class=&html&&&%@ page language=&java& c/ charset=UTF-8&
pageEncoding=&UTF-8&%&
String path=request.getContextPath()%&
&!DOCTYPE html&
&html lang=&en&&
&meta name=&viewport& c initial-scale=1.0&&
&title&Bootstrap分页实例&/title&
&link href=&&%=path%&/static/js/bootstrap//css/bootstrap.min.css& rel=&stylesheet&&
&script src=&&%=path%&/static/js/jQuery/jquery-2.1.4.min.js&&&/script&
&script src=&&%=path%&/static/js/bootstrap/js/bootstrap.min.js&&&/script&
&script src=&&%=path%&/static/js/bootstrap/js/bootstrap-paginator.min.js&&&/script&
&style type=&text/css&&
#queryDiv {
margin-right:
margin-left:
#textInput {
margin-top: 10
#tableResult {
margin-right:
margin-left:
width:150px
&div id = &queryDiv&&
&input id = &textInput& type=&text& placeholder=&请输入用户名& &
&button id = &queryButton& class=&btn btn-primary& type=&button&&查询&/button&
&form id=&form1&&
&table class=&table table-bordered& id = 'tableResult'&
&caption&查询用户结果&/caption&
&th&序号&/th&
&th&用户名&/th&
&th&密码&/th&
&th&用户邮箱&/th&
&tbody id=&tableBody&&
&!-- 底部分页按钮 --&
&div id=&bottomTab& &&/div&
&script type='text/javascript'&
var PAGESIZE = 5;
var options = {
currentPage: 1,
//当前页数
totalPages: 5,
//总页数,这里只是暂时的,后头会根据查出来的条件进行更改
size:&normal&,
alignment:&center&,
itemTexts: function (type, page, current) {
switch (type) {
case &first&:
return &第一页&;
case &prev&:
return &前一页&;
case &next&:
return &后一页&;
case &last&:
return &最后页&;
case &page&:
onPageClicked: function (e, originalEvent, type, page) {
var userName = $(&#textInput&).val(); //取内容
buildTable(userName,page,PAGESIZE);//默认每页最多10条
//获取当前项目的路径
var urlRootContext = (function () {
var strPath = window.document.location.
var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1);
return postP
//生成表格
function buildTable(userName,pageNumber,pageSize) {
urlRootContext + &/list.do&; //请求的网址
var reqParams = {'userName':userName, 'pageNumber':pageNumber,'pageSize':pageSize};//请求数据
$(function () {
type:&POST&,
data:reqParams,
async:false,
dataType:&json&,
success: function(data){
if(data.isError == false) {
// options.totalPages = data.
var newoptions = {
currentPage: 1,
//当前页数
totalPages: data.pages==0?1:data.pages,
size:&normal&,
alignment:&center&,
itemTexts: function (type, page, current) {
switch (type) {
case &first&:
return &第一页&;
case &prev&:
return &前一页&;
case &next&:
return &后一页&;
case &last&:
return &最后页&;
case &page&:
onPageClicked: function (e, originalEvent, type, page) {
var userName = $(&#textInput&).val(); //取内容
buildTable(userName,page,PAGESIZE);//默认每页最多10条
$('#bottomTab').bootstrapPaginator(&setOptions&,newoptions); //重新设置总页面数目
var dataList = data.dataL
$(&#tableBody&).empty();//清空表格内容
if (dataList.length & 0 ) {
$(dataList).each(function(){//重新生成
$(&#tableBody&).append('&tr&');
$(&#tableBody&).append('&td&' + this.userId + '&/td&');
$(&#tableBody&).append('&td&' + this.userName + '&/td&');
$(&#tableBody&).append('&td&' + this.userPassword + '&/td&');
$(&#tableBody&).append('&td&' + this.userEmail + '&/td&');
$(&#tableBody&).append('&/tr&');
$(&#tableBody&).append('&tr&&th colspan =&4&&&center&查询无数据&/center&&/th&&/tr&');
alert(data.errorMsg);
error: function(e){
alert(&查询失败:& + e);
//渲染完就执行
$(function() {
//生成底部分页栏
$('#bottomTab').bootstrapPaginator(options);
buildTable(&&,1,5);//默认空白查全部
//创建结算规则
$(&#queryButton&).bind(&click&,function(){
var userName = $(&#textInput&).val();
buildTable(userName,1,PAGESIZE);
&/html&&/pre&&p&&/p&&p&&pre name=&code& class=&sql&&create table T_USER
VARCHAR2(200),
USER_PASSWORD VARCHAR2(200),
USER_EMAIL
VARCHAR2(200)
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (2, 'ding', '12345', '', 'AAAbSkAAOAAAAT/AAB');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (3, 'wang', '12345', '', 'AAAbSkAAOAAAAT/AAC');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (4, 'zhao', '12345', '', 'AAAbSkAAOAAAAT/AAD');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (5, '张三', '12345', '', 'AAAbSkAAOAAAAT/AAE');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (6, 'li', '12345', '', 'AAAbSkAAOAAAAT/AAF');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (7, 'jiang', '12345', '', 'AAAbSkAAOAAAAT/AAG');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (8, 'zheng', '12345', '', 'AAAbSkAAOAAAAT/AAH');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (9, 'liu', '12345', '', 'AAAbSkAAOAAAAT/AAI');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (10, 'yu', '12345', '', 'AAAbSkAAOAAAAT/AAJ');
insert into t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL, ROWID)
values (11, 'gu', '12345', '', 'AAAbSkAAOAAAAT/AAK');下载工程地址http://download.csdn.net/detail/u32718点击打开链接访问地址:http://localhost:8080/ssm_project/bootstrapPage
以上就介绍了bootstrap +springMVC+mybtis分页,包括了springmvc,Bootstrap方面的内容,希望对Javascript教程有兴趣的朋友有所帮助。
本文网址链接:/article/detail_1337596.html
上一篇: 下一篇:&mvc:annotation-driven&&&&&&&&!--&处理responseBody&里面日期类型&--&&&&&&&&&&&&mvc:message-converters&&&&&&&&&&&&&&&&bean&class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&&&&&&&&&&&&&&&&&&&&property&name="objectMapper"&&&&&&&&&&&&&&&&&&&&&&&&bean&class="com.fasterxml.jackson.databind.ObjectMapper"&&&&&&&&&&&&&&&&&&&&&&&&&&&&property&name="dateFormat"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bean&class="java.text.SimpleDateFormat"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&constructor-arg&type="java.lang.String"&value="yyyy-MM-dd&HH:mm:ss"&/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&&&/bean&&&&&&&&&&&&/mvc:message-converters&&&&&&&&/mvc:annotation-driven&&&方法二:局部注解处理&import&java.io.IOE&&import&java.text.SimpleDateF&&import&java.util.D&&&&import&com.fasterxml.jackson.core.JsonG&&import&com.fasterxml.jackson.core.JsonProcessingE&&import&com.fasterxml.jackson.databind.JsonS&&import&com.fasterxml.jackson.databind.SerializerP&&&&/**&&&*&ClassName:DateJsonSerializer&&br/&&&&*&Function:&日期类型格式化,格式化为:yyyy-MM-dd&HH:mm:ss&格式.&用法如下:&br/&&&&*&Reason:&&&@JsonSerialize(using=DateJsonSerializer.class)&&*&&&&&&&&&&&@Column(name="BIRTHDAY")&&*&&&&&&&&&&&public&Date&getBirthday()&{&&*&&&&&&&&&&&&&&return&&&*&&&&&&&&&&&}&&*&&&&&&&&&&.&&br/&&&&*&Date:&&&&&日&下午1:26:08&&br/&&&&*&@author&&&zhangzhaoyu&&&*&@version&&&1.0&&*&@since&&&&JDK&1.7&&&*&@see&&&&&&&&&*/&&public&class&DateJsonSerializer&extends&JsonSerializer&Date&&{&&&&&&&&@Override&&&&&&public&void&serialize(Date&value,&JsonGenerator&jgen,&&&&&&&&&&&&&&SerializerProvider&provider)&throws&IOException,&&&&&&&&&&&&&&JsonProcessingException&{&&&&&&&&&&&SimpleDateFormat&formatter&=&new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss");&&&&&&&&&&&String&formattedDate&=&formatter.format(value);&&&&&&&&&&&jgen.writeString(formattedDate);&&&&&&}&&&&} &方法三:jackson 注解处理@JsonIgnoreProperties&&&&&&&&&&&此注解是类注解,作用是json序列化时将java&bean中的一些属性忽略掉,序列化和反序列化都受影响。&&&&@JsonIgnore&&&&&&&&&&&此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。&&&&@JsonFormat&&&&&&&&&&此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern&=&"yyyy-MM-dd&HH-mm-ss")&&&&@JsonSerialize&&&&&//&反序列化一个固定格式的Date&&&&&&&&@JsonDeserialize(using&=&CustomDateDeserialize.class)&&&&&&&&public&void&setBirthday(Date&birthday)&{&&&&&&&&&&&&this.birthday&=&&&&&&&&&}&&&&&&//&序列化指定格式的double格式&&&&&&&&@JsonSerialize(using&=&CustomDoubleSerialize.class)&&&&&&&&public&double&getSalary()&{&&&&&&&&&&&&return&&&&&&&&&}&&&&&&public&class&CustomDateDeserialize&extends&JsonDeserializer&Date&&{&&&&&&&&&&&&private&SimpleDateFormat&sdf&=&new&SimpleDateFormat("yyyy-MM-dd");&&&&&&&&&&&&@Override&&&&&&&&public&Date&deserialize(JsonParser&jp,&DeserializationContext&ctxt)&&&&&&&&&&&&&&&&throws&IOException,&JsonProcessingException&{&&&&&&&&&&&&&&&&Date&date&=&null;&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&date&=&sdf.parse(jp.getText());&&&&&&&&&&&&}&catch&(ParseException&e)&{&&&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&}&&&&&&&&&&&&return&&&&&&&&&}&&&&} &&摘自:http://blog.csdn.net/zhanngle/article/details/&&又到搭新开发环境的时候,总是不免去网上搜下目前最新的框架。spring是web开发必用的框架,于是乎下载了目前最新的spring4.0.3,同时越来越不想用struts2,想试试spring mvc,也将spring-webmvc4.0.3下了下来,投入两天时间学习后,发现还是挺优雅的,特别是从3.0后,spring mvc使用注解方式配制,以及对rest风格的支持,真是完美致极。下面将这两天研究到的问题做个总结,供参考。1.request对象的获取方式1:在controller方法上加入request参数,spring会自动注入,如:public&String&list(HttpServletRequest&request,HttpServletResponse&response)方式2:在controller类中加入@Resource private HttpServletRequest request 属性,spring会自动注入,这样不知道会不会出现线程问题,因为一个controller实例会为多个请求服务,暂未测试。方式3:在controller方法中直接写代码获取&HttpServletRequest&request&=&((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();方式4:在controller中加入以下方法,此方法会在执行此controller的处理方法之前执行@ModelAttribute&&private&void&initServlet(HttpServletRequest&request,HttpServletResponse&response)&{&&&&&&//String&p=request.getParameter("p");&&&&&&//this.req=//实例变量,有线程安全问题,可以使用ThreadLocal模式保存&&} &2.response对象的获取可以参照以上request的获取方式1和方式4,方式2和方式3对response对象无效!3.表单提交之数据填充直接在方法上加入实体对象参数,spring会自动填充对象中的属性,对象属性名要与&input&的name一致才会填充.如:public boolean doAdd(Demo demo)4.表单提交之数据转换-Date类型在实体类的属性或get方法上加入 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss"),那么表单中的日期字符串就会正确的转换为Date类型了。还有@NumberFormat注解,暂时没用,就不介绍了,一看就知道是对数字转换用的。5.json数据返回在方法上加入@ResponseBody,同时方法返回值为实体对象,spring会自动将对象转换为json格式,并返回到客户端。如下所示:@RequestMapping("/json1")&&@ResponseBody&&public&Demo&json1()&{&&&&&&Demo&demo=new&Demo();&&&&&&demo.setBirthday(new&Date());&&&&&&demo.setCreateTime(new&Date());&&&&&&demo.setHeight(170);&&&&&&demo.setName("tomcat");&&&&&&&demo.setRemark("json测试");&&&&&&&demo.setStatus((short)1);&&&&&&&return&&&} &注意:spring配置文件要加上:&mvc:annotation-driven/&,同时还要引入jackson-core.jar,jackson-databind.jar,jackson-annotations.jar(2.x的包)才会自动转换json这种方式是spring提供的。我们还可以自定义输出json,以上第二条不是说了获取response对象吗,拿到response对象后,任由开发人员宰割,想怎么返回就怎么返回。方法不要有返回值,如下:@RequestMapping("/json2")&&public&void&json2()&{&&&&&&Demo&demo=new&Demo();&&&&&&demo.setBirthday(new&Date());&&&&&&demo.setCreateTime(new&Date());&&&&&&demo.setHeight(170);&&&&&&demo.setName("tomcat");&&&&&&demo.setRemark("json测试");&&&&&&demo.setStatus((short)1);&&&&&&String&json=JsonUtil.toJson(obj);//;json处理工具类&&&&&&HttpServletResponse&response&=&//获取response对象&&&&&&response.getWriter().print(json);&&} &OK,一切很完美。接着恶心的问题迎面而来,date类型转换为json字符串时,返回的是long time值,如果你想返回“yyyy-MM-dd HH:mm:ss”格式的字符串,又要自定义了。我很奇怪,不是有@DateTimeFormat注解吗,为什么不利用它。难道@DateTimeFormat只在表单提交时,将字符串转换为date类型,而date类型转换为json字符串时,就不用了。带着疑惑查源码,原来spring使用jackson转换json字符,而@DateTimeFormat是spring-context包中的类,jackson如何转换,spring不方便作过多干涉,于是只能遵守jackson的转换规则,自定义日期转换器。先写一个日期转换器,如下:public&class&JsonDateSerializer&extends&JsonSerializer&Date&&{&&&&&private&SimpleDateFormat&dateFormat=new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss");&&&&&@Override&&&&&public&void&serialize(Date&date,&JsonGenerator&gen,&SerializerProvider&provider)&&throws&IOException,&JsonProcessingException&{&&&&&&&&&String&value&=&dateFormat.format(date);&&&&&&&&&gen.writeString(value);&&&&&}&&} &在实体类的get方法上配置使用转换器,如下:@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&@JsonSerialize(using=JsonDateSerializer.class)&&public&Date&getCreateTime()&{&&&&&&return&this.createT&&} &OK,到此搞定。你真的满意了吗,这么不优雅的解决方案,假设birthday属性是这样的,只有年月日,无时分秒@DateTimeFormat(pattern="yyyy-MM-dd")&&public&Date&getBirthday()&{&&&&&&return&this.&&}&&这意味着,又要为它定制一个JsonDate2Serializer的转换器,然后配置上,像这样@DateTimeFormat(pattern="yyyy-MM-dd")&&@JsonSerialize(using=JsonDate2Serializer.class)&&public&Date&getBirthday()&{&&&&&&return&this.&&} &假设还有其它格式的Date字段,还得要为它定制另一个转换器。my god,请饶恕我的罪过,不要让我那么难受经过分析源码,找到一个不错的方案,此方案将不再使用@JsonSerialize,而只利用@DateTimeFormat配置日期格式,jackson就可以正确转换,但@DateTimeFormat只能配置在get方法上,这也没什么关系。先引入以下类,此类对jackson的ObjectMapper类做了注解扫描拦截,使它也能对加了@DateTimeFormat的get方法应用日期格式化规则package&com.xxx.&&&&import&java.io.IOE&&import&java.lang.reflect.AnnotatedE&&import&java.text.SimpleDateF&&import&java.util.D&&import&org.springframework.format.annotation.DateTimeF&&import&org.&&import&com.fasterxml.jackson.core.JsonG&&import&com.fasterxml.jackson.core.JsonProcessingE&&import&com.fasterxml.jackson.databind.JsonS&&import&com.fasterxml.jackson.databind.ObjectM&&import&com.fasterxml.jackson.databind.SerializerP&&import&com.fasterxml.jackson.databind.introspect.A&&import&com.fasterxml.jackson.databind.introspect.AnnotatedM&&import&com.fasterxml.jackson.databind.introspect.JacksonAnnotationI&&&&/**&&*&json处理工具类&&*&@author&zhangle&&*/&&@Component&&public&class&JsonUtil&{&&&&&&&&&&private&static&final&String&DEFAULT_DATE_FORMAT="yyyy-MM-dd&HH:mm:ss";&&&&&&&&&&private&static&final&ObjectMapper&&&&&&&&&&&&&&&&&&&&&public&ObjectMapper&getMapper()&{&&&&&&&&&&&&&&&&&&return&&&&&&&&&&&}&&&&&&&&&&&&static&{&&&&&&&&&&&&&&&&&&SimpleDateFormat&dateFormat&=&new&SimpleDateFormat(DEFAULT_DATE_FORMAT);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&mapper&=&new&ObjectMapper();&&&&&&&&&&&&&&&&&&mapper.setDateFormat(dateFormat);&&&&&&&&&&&&&&&&&&mapper.setAnnotationIntrospector(new&JacksonAnnotationIntrospector()&{&&&&&&&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&&&&&&&&&&&&&public&Object&findSerializer(Annotated&a)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(a&instanceof&AnnotatedMethod)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AnnotatedElement&m=a.getAnnotated();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DateTimeFormat&an=m.getAnnotation(DateTimeFormat.class);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(an!=null)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(!DEFAULT_DATE_FORMAT.equals(an.pattern()))&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&new&JsonDateSerializer(an.pattern());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&super.findSerializer(a);&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&});&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&static&String&toJson(Object&obj)&{&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&return&mapper.writeValueAsString(obj);&&&&&&&&&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&throw&new&RuntimeException("转换json字符失败!");&&&&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&&T&&T&toObject(String&json,Class&T&&clazz)&{&&&&&&&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&&&&&&&&&&&return&mapper.readValue(json,&clazz);&&&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&&&&&&&&&&&&&throw&new&RuntimeException("将json字符转换为对象时失败!");&&&&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&public&static&class&JsonDateSerializer&extends&JsonSerializer&Date&{&&&&&&&&&&&&&&private&SimpleDateFormat&dateF&&&&&&&&&&&&&&public&JsonDateSerializer(String&format)&{&&&&&&&&&&&&&&&&&&&dateFormat&=&new&SimpleDateFormat(format);&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&&&&&public&void&serialize(Date&date,&JsonGenerator&gen,&SerializerProvider&provider)&&&&&&&&&&&&&&&&&&&&&&throws&IOException,&JsonProcessingException&{&&&&&&&&&&&&&&&&&&String&value&=&dateFormat.format(date);&&&&&&&&&&&&&&&&&&gen.writeString(value);&&&&&&&&&&&&&&}&&&&&&&&&&}&&} &再将&mvc:annotation-driven/&改为以下配置,配置一个新的json转换器,将它的ObjectMapper对象设置为JsonUtil中的objectMapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。&mvc:annotation-driven&&&&&&&&mvc:message-converters&&&&&&&&&&&&bean&class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&&&&&&&&&&&&&&&&property&name="objectMapper"&value="#{jsonUtil.mapper}"/&&&&&&&&&&&&&&&&property&name="supportedMediaTypes"&&&&&&&&&&&&&&&&&&&&list&&&&&&&&&&&&&&&&&&&&&&&&value&text/charset=UTF-8&/value&&&&&&&&&&&&&&&&&&&&/list&&&&&&&&&&&&&&&&/property&&&&&&&&&&&&&&/bean&&&&&&&&/mvc:message-converters&&&&/mvc:annotation-driven&&&接下来就可以这样配置实体类,jackson也能正确转换Date类型@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&public&Date&getCreateTime()&{&&&&&&return&this.createT&&}&&@DateTimeFormat(pattern="yyyy-MM-dd")&&public&Date&getBirthday()&{&&&&&&return&this.&&} &完毕,一切都完美了。以下为 补充写了那么多,发现白忙活了一场,原来jackson也有一个@JsonFormat注解,将它配置到Date类型的get方法上后,jackson就会按照配置的格式转换日期类型,而不自定义转换器类,欲哭无泪啊。辛苦了那么多,其实别人早已提供,只是没有发现而已。不说了,直接上方案吧。1.spring配置照样是这样:2.JsonUtil可以不用了,但如果要自己从response对象输出json,那么还是可以用,但改成了这样package&com.xxx.&&&&import&java.io.IOE&&import&java.text.SimpleDateF&&import&org.&&import&com.fasterxml.jackson.databind.ObjectM&&&&/**&&*&json处理工具类&&*&@author&zhangle&&*/&&@Component&&public&class&JsonUtil&{&&&&&&&&private&static&final&String&DEFAULT_DATE_FORMAT="yyyy-MM-dd&HH:mm:ss";&&&&&&private&static&final&ObjectMapper&&&&&&&&&static&{&&&&&&&&&&SimpleDateFormat&dateFormat&=&new&SimpleDateFormat(DEFAULT_DATE_FORMAT);&&&&&&&&&&mapper&=&new&ObjectMapper();&&&&&&&&&&mapper.setDateFormat(dateFormat);&&&&&&}&&&&&&&&&&&&public&static&String&toJson(Object&obj)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&return&mapper.writeValueAsString(obj);&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&throw&new&RuntimeException("转换json字符失败!");&&&&&&&&&&}&&&&&&}&&&&&&&&&&&&public&&t&&T&toObject(String&json,Class&t&&clazz)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&return&mapper.readValue(json,&clazz);&&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&&&throw&new&RuntimeException("将json字符转换为对象时失败!");&&&&&&&&&&}&&&&&&}&&}3.实体类的get方法就需要多一个@JsonFormat的注解配置@DateTimeFormat(pattern="yyyy-MM-dd&HH:mm:ss")&&@JsonFormat(pattern="yyyy-MM-dd&HH:mm:ss",timezone&=&"GMT+8")&&public&Date&getCreateTime()&{&&return&this.createT&&}&&@DateTimeFormat(pattern="yyyy-MM-dd")&&@JsonFormat(pattern="yyyy-MM-dd",timezone&=&"GMT+8")&&public&Date&getBirthday()&{&&&&&&return&this.&&} &
&re: SpringMVC+MyBatis - 12 spring mvc4返回的json日期为Long的解决方案[未登录]&&&&
请问实体类有个字段叫name,序列json时,想把name替换成text,应该怎么做呢,在需要进行转换时自定义,不用注解
&re: SpringMVC+MyBatis - 12 spring mvc4返回的json日期为Long的解决方案&&&&
垃圾,根本没用
积分与排名
阅读排行榜}

我要回帖

更多关于 springmvc参数传递 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信