Springmvc框架--使用自定义编辑器来实现日期格式的转换

需求:使用自定义编辑器的方式来实现日期格式的转换

添加一个BaseController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
package cn.smbms.controller;
 
import java.sql.Date;
import java.text.SimpleDateFormat;
 
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
 
public class BaseController {
    @InitBinder
    public void initBinder(WebDataBinder dataBinder){
       System.out.println("initBinder==================");
       dataBinder.registerCustomEditor(Date.class,  new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
} 让UserController.java继承BaseController  1 package cn.smbms.controller;
  2
  3 import java.io.File;
  4 import java.util.Date;
  5 import java.util.HashMap;
  6 import java.util.List;
  7
  8 import javax.annotation.Resource;
  9 import javax.servlet.http.HttpServletRequest;
 10 import javax.servlet.http.HttpSession;
 11 import javax.validation.Valid;
 12
 13 import org.apache.commons.io.FilenameUtils;
 14 import org.apache.commons.lang.math.RandomUtils;
 15 import org.apache.log4j.Logger;
 16 import org.springframework.stereotype.Controller;
 17 import org.springframework.ui.Model;
 18 import org.springframework.validation.BindingResult;
 19 import org.springframework.web.bind.annotation.ModelAttribute;
 20 import org.springframework.web.bind.annotation.PathVariable;
 21 import org.springframework.web.bind.annotation.RequestMapping;
 22 import org.springframework.web.bind.annotation.RequestMethod;
 23 import org.springframework.web.bind.annotation.RequestParam;
 24 import org.springframework.web.bind.annotation.ResponseBody;
 25 import org.springframework.web.multipart.MultipartFile;
 26
 27 import com.alibaba.fastjson.JSON;
 28 import com.alibaba.fastjson.JSONArray;
 29 import com.mysql.jdbc.StringUtils;
 30
 31 import cn.smbms.pojo.Role;
 32 import cn.smbms.pojo.User;
 33 import cn.smbms.service.role.RoleService;
 34 import cn.smbms.service.user.UserService;
 35 import cn.smbms.tools.Constants;
 36 import cn.smbms.tools.PageSupport;
 37
 38 @Controller
 39 @RequestMapping("/user")
 40 public class UserController extends BaseController{
 41     private Logger logger = Logger.getLogger(UserController.class);
 42
 43     @Resource
 44     private UserService userService;
 45     @Resource
 46     private RoleService roleService;
 47
 48     @RequestMapping(value = "/login.html")
 49     public String login() {
 50         logger.debug("UserController welcome SMBMS==================");
 51         return "login";
 52     }
 53
 54     @RequestMapping(value = "/dologin.html", method = RequestMethod.POST)
 55     public String doLogin(@RequestParam String userCode,
 56             @RequestParam String userPassword, HttpServletRequest request,
 57             HttpSession session) {
 58         logger.debug("doLogin====================================");
 59         // 调用service方法,进行用户匹配
 60         User user = userService.login(userCode, userPassword);
 61         if (null != user) {// 登录成功
 62             // 放入session
 63             session.setAttribute(Constants.USER_SESSION, user);
 64             // 页面跳转(frame.jsp)
 65             return "redirect:/user/main.html";
 66             // response.sendRedirect("jsp/frame.jsp");
 67         } else {
 68             // 页面跳转(login.jsp)带出提示信息--转发
 69             request.setAttribute("error", "用户名或密码不正确");
 70             return "login";
 71         }
 72     }
 73
 74     @RequestMapping(value = "/main.html")
 75     public String main(HttpSession session) {
 76         if (session.getAttribute(Constants.USER_SESSION) == null) {
 77             return "redirect:/user/login.html";
 78         }
 79         return "frame";
 80     }
 81
 82     @RequestMapping(value = "/logout.html")
 83     public String logout(HttpSession session) {
 84         // 清除session
 85         session.removeAttribute(Constants.USER_SESSION);
 86         return "login";
 87     }
 88
 89     @RequestMapping(value = "/exlogin.html", method = RequestMethod.GET)
 90     public String exLogin(@RequestParam String userCode,
 91             @RequestParam String userPassword) {
 92         logger.debug("exLogin====================================");
 93         // 调用service方法,进行用户匹配
 94         User user = userService.login(userCode, userPassword);
 95         if (null == user) {// 登录失败
 96             throw new RuntimeException("用户名或者密码不正确!");
 97         }
 98         return "redirect:/user/main.html";
 99     }
100
101     /*
102      * @ExceptionHandler(value={RuntimeException.class}) public String
103      * handlerException(RuntimeException e,HttpServletRequest req){
104      * req.setAttribute("e", e); return "error"; }
105      */
106
107     @RequestMapping(value = "/userlist.html")
108     public String getUserList(
109             Model model,
110             @RequestParam(value = "queryname", required = false) String queryUserName,
111             @RequestParam(value = "queryUserRole", required = false) String queryUserRole,
112             @RequestParam(value = "pageIndex", required = false) String pageIndex) {
113         logger.info("getUserList ---- > queryUserName: " + queryUserName);
114         logger.info("getUserList ---- > queryUserRole: " + queryUserRole);
115         logger.info("getUserList ---- > pageIndex: " + pageIndex);
116         int _queryUserRole = 0;
117         List<User> userList = null;
118         // 设置页面容量
119         int pageSize = Constants.pageSize;
120         // 当前页码
121         int currentPageNo = 1;
122
123         if (queryUserName == null) {
124             queryUserName = "";
125         }
126         if (queryUserRole != null && !queryUserRole.equals("")) {
127             _queryUserRole = Integer.parseInt(queryUserRole);
128         }
129
130         if (pageIndex != null) {
131             try {
132                 currentPageNo = Integer.valueOf(pageIndex);
133             } catch (NumberFormatException e) {
134                 return "redirect:/user/syserror.html";
135                 // response.sendRedirect("syserror.jsp");
136             }
137         }
138         // 总数量(表)
139         int totalCount = userService
140                 .getUserCount(queryUserName, _queryUserRole);
141         // 总页数
142         PageSupport pages = new PageSupport();
143         pages.setCurrentPageNo(currentPageNo);
144         pages.setPageSize(pageSize);
145         pages.setTotalCount(totalCount);
146         int totalPageCount = pages.getTotalPageCount();
147         // 控制首页和尾页
148         if (currentPageNo < 1) {
149             currentPageNo = 1;
150         } else if (currentPageNo > totalPageCount) {
151             currentPageNo = totalPageCount;
152         }
153         userList = userService.getUserList(queryUserName, _queryUserRole,
154                 currentPageNo, pageSize);
155         model.addAttribute("userList", userList);
156         List<Role> roleList = null;
157         roleList = roleService.getRoleList();
158         model.addAttribute("roleList", roleList);
159         model.addAttribute("queryUserName", queryUserName);
160         model.addAttribute("queryUserRole", queryUserRole);
161         model.addAttribute("totalPageCount", totalPageCount);
162         model.addAttribute("totalCount", totalCount);
163         model.addAttribute("currentPageNo", currentPageNo);
164         return "userlist";
165     }
166
167     @RequestMapping(value = "/syserror.html")
168     public String sysError() {
169         return "syserror";
170     }
171
172     @RequestMapping(value = "/useradd.html", method = RequestMethod.GET)
173     public String addUser(@ModelAttribute("user") User user) {
174         return "useradd";
175     }
176
177     /*
178      * @RequestMapping(value="/useradd.html",method=RequestMethod.GET) public
179      * String addUser(User user,Model model){ model.addAttribute("user", user);
180      * return "useradd"; }
181      */
182     // 其中request对象主要用来存放错误信息,便于前台获取进行相应的提示,现在是多文件上传
183     @RequestMapping(value = "/useraddsave.html", method = RequestMethod.POST)
184     public String addUserSave(
185             User user,
186             HttpSession session,
187             HttpServletRequest request,
188             @RequestParam(value = "attachs", required = false) MultipartFile[] attachs) {
189         // 编写文件上传的代码
190         // 1.判断上传的文件是否为空
191         String idPicPath = null;
192         String workPicPath = null;
193         String errorInfo = null;// 定义统一的错误信息提示
194         boolean flag = true;
195         String path = request.getSession().getServletContext()
196                 .getRealPath("statics" + File.separator + "uploadfiles");
197         logger.info("uploadFile path ============== > " + path);
198
199         // 现在传过来的是多文件,使用的是数组,要进行循环遍历
200         for (int i = 0; i < attachs.length; i++) {
201             MultipartFile attach = attachs[i];
202             // 如果上传的文件不为空 与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 的值的第一个字符。在
203             // UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
204             if (i == 0) {
205                 errorInfo = "uploadFileError";
206             } else if (i == 1) {
207                 errorInfo = "uploadwpFileError";
208             }
209
210             String oldFileName = attach.getOriginalFilename();// 原来你存在电脑盘符的文件名
211             logger.info("原来的文件名 ============== > " + oldFileName);
212             String prefix = FilenameUtils.getExtension(oldFileName);
213             logger.info("上传文件的后缀:" + prefix);
214             int filesize = 500000;// 表示文件大小是500k
215             if (!attach.isEmpty()) {
216                 if (attach.getSize() > filesize) {
217                     request.setAttribute("errorInfo", "上传的文件大小不得超过500k");
218                     flag = false;
219                     // 判断文件的上传文件的格式
220                 } else if (prefix.equalsIgnoreCase("jpg")
221                         || prefix.equalsIgnoreCase("png")
222                         || prefix.equalsIgnoreCase("pneg")) {
223                     String fileName = System.currentTimeMillis()
224                             + RandomUtils.nextInt(10000000) + "Personal.jpg";
225                     logger.debug("new fileName======== " + attach.getName());
226                     File targetFile = new File(path, fileName);
227                     logger.info("上传到服务器的文件名是:" + targetFile.toString());
228                     // 如果服务器的文件路径存在的话,就进行创建
229                     if (!targetFile.exists()) {
230                         /*
231                          * mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:
232                          * new File("/tmp/one/two/three").mkdirs();
233                          * 执行后, 会建立tmp/one/two/three四级目录
234                          * new File("/tmp/one/two/three").mkdir();
235                          * 则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false
236                          */
237                         targetFile.mkdirs();
238                     }
239                     try {
240                         attach.transferTo(targetFile);
241                     } catch (Exception e) {
242                         // TODO Auto-generated catch block
243                         e.printStackTrace();
244                         request.setAttribute("errorInfo", "上传文件失败");
245                         flag = false;
246                     }
247                     // 文件路径
248                     if (i == 0) {
249                         idPicPath = path + File.separator + fileName;
250                     } else if (i == 1) {
251                         workPicPath = path + File.separator + fileName;
252                     }
253                     logger.debug("idPicPath: " + idPicPath);
254                     logger.debug("workPicPath: " + workPicPath);
255                 } else {
256                     request.setAttribute("errorInfo", " * 上传图片格式不正确");
257                     flag = false;
258                 }
259             }
260         }
261
262         if (flag) {
263             user.setCreatedBy(((User) session
264                     .getAttribute(Constants.USER_SESSION)).getId());
265             user.setCreationDate(new Date());
266             user.setIdPicPath(idPicPath);
267             user.setWorkPicPath(workPicPath);
268             if (userService.add(user)) {
269                 return "redirect:/user/userlist.html";
270             }
271         }
272         return "useradd";
273     }
274
275     // 练习
276     @RequestMapping(value = "/add.html", method = RequestMethod.GET)
277     public String add(@ModelAttribute("user") User user) {
278         return "user/useradd";
279     }
280
281     // 添加相应的保存方法
282     @RequestMapping(value = "/add.html", method = RequestMethod.POST)
283     // 添加相应的注解,调用验证框架,如果发现错误,会将错误保存在紧挨着的对象中bindingResult 或者是对应的error对象中
284     public String addSave(@Valid User user, BindingResult bindingResult,
285             HttpSession session) {
286         // 对bindingResult对象进行验证
287         if (bindingResult.hasErrors()) {
288             logger.debug("数据验证的时候发生错误");
289             return "user/useradd";
290         }
291         user.setCreatedBy(((User) session.getAttribute(Constants.USER_SESSION))
292                 .getId());
293         user.setCreationDate(new Date());
294         if (userService.add(user)) {
295             return "redirect:/user/userlist.html";
296         }
297         return "user/useradd";
298     }
299
300     // 根据用户id获取用户信息,跳转到用户修改信息列表页面
301     @RequestMapping(value = "/userModify.html", method = RequestMethod.GET)
302     public String getUserById(@RequestParam String uid, Model model) {
303         User user = userService.getUserById(uid);
304         model.addAttribute("user", user);
305         return "usermodify";
306     }
307
308     // 修改用户信息,提交表单的操作
309     @RequestMapping(value = "/userModifySave.html", method = RequestMethod.POST)
310     public String modifyUserSave(User user, HttpSession httpSession) {
311         user.setModifyBy(((User) httpSession
312                 .getAttribute(Constants.USER_SESSION)).getId());
313         user.setModifyDate(new Date());
314         // 判断有没有添加成功
315         if (userService.modify(user)) {
316             // 想:添加成功了之后,要返回到用户列表页面中去,并且从新刷新页面,客户端从新发起请求,使用重定向
317             return "redirect:/user/userlist.html";
318         }
319         return "usermodify";
320
321     }
322
323     // 根据用户id查询用户的详细信息
324     @RequestMapping(value = "/view/{id}", method = RequestMethod.GET)
325     public String view(@PathVariable String id, Model model) {
326         User user = userService.getUserById(id);
327         model.addAttribute("user", user);
328         return "userview";
329
330     }
331    
332     //添加相应验证控制器 ResponseBody的作用就是将异步请求返回来的结果绑定到ResponseBody对象上面
333     @RequestMapping(value="ucexist.html")
334     @ResponseBody
335     public Object userCodeIsExist(@RequestParam String userCode){
336         HashMap<String, String> resultMap=new HashMap<String, String>();
337         if(StringUtils.isNullOrEmpty(userCode)){
338             resultMap.put("userCode", "exist");
339         }else{
340             User user = userService.selectUserCodeExist(userCode);
341             if(user!=null){
342                 resultMap.put("userCode","exist");
343             }else{
344                 resultMap.put("userCode", "noexist");
345             }
346         }
347         return JSONArray.toJSONString(resultMap);
348     }
349    
350     //添加相应的控制器,实现异步请求  一开始是value="/view.html"会报406的错误
351     @RequestMapping(value="/view",method= RequestMethod.GET/*,produces={"application/json;charset=UTF-8"}*/)
352     @ResponseBody   
353     public User view(@RequestParam String id){
354         User user=new User();
355             try {
356                 user=userService.getUserById(id);
357                
358             } catch (Exception e) {
359                 // TODO: handle exception
360                 e.printStackTrace();
361            
362             }
363         return user;
364     }
365    
366 }修改springmvc-servlet.xml配置文件,将mvc:annotation-driven中引用的自定义的转换器去掉就可以了   1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4     xmlns:mvc="http://www.springframework.org/schema/mvc"
  5     xmlns:p="http://www.springframework.org/schema/p"
  6     xmlns:context="http://www.springframework.org/schema/context"
  7     xsi:schemaLocation="
  8         http://www.springframework.org/schema/beans
  9         http://www.springframework.org/schema/beans/spring-beans.xsd
 10         http://www.springframework.org/schema/context
 11         http://www.springframework.org/schema/context/spring-context.xsd
 12         http://www.springframework.org/schema/mvc
 13         http://www.springframework.org/schema/mvc/spring-mvc.xsd">
 14        
 15     <context:component-scan base-package="cn.smbms.controller"/>   
 16     <!-- 指定mvc:annotation-driven的默认实现,现在使用的是自己自定义的转化器 -->
 17     <mvc:annotation-driven>
 18         <mvc:message-converters>
 19             <bean class="org.springframework.http.converter.StringHttpMessageConverter">
 20                 <property name="supportedMediaTypes">
 21                     <list>
 22                         <value>application/json;charset=UTF-8</value>
 23                     </list>
 24                 </property>
 25             </bean>
 26             <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
 27                 <property name="supportedMediaTypes">
 28                     <list>
 29                         <value>text/html;charset=UTF-8</value>
 30                         <value>application/json</value>
 31                     </list>
 32                 </property>
 33                 <property name="features">
 34                     <list>
 35                       <!--  Date的日期转换器 -->
 36                       <value>WriteDateUseDateFormat</value>
 37                     </list>
 38                 </property>
 39             </bean>
 40         </mvc:message-converters>
 41     </mvc:annotation-driven>
 42     <!--创建conversionService实例  当我们在遇到前后台日期类型转换的问题的时候,其实有mvc:annotation-driven一键式配置好了,所以conversionService实例不用也是可以的-->
 43    <!--  <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"></bean> -->
 44   
 45    <!-- 引用自己自定义的转化器 -->
 46    <bean id="myConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
 47        <property name="converters">
 48            <list>
 49                <bean class="cn.smbms.tools.StringToDateConvertor">
 50                   <!-- 构造注入 -->
 51                   <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
 52               
 53                </bean>
 54           
 55           
 56           
 57            </list>
 58       
 59       
 60        </property>
 61    </bean>
 62   
 63     <mvc:resources mapping="/statics/**" location="/statics/" />
 64     <!-- 完成视图的对应 -->
 65     <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
 66     <!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
 67         <property name="prefix" value="/WEB-INF/jsp/"/>
 68         <property name="suffix" value=".jsp"/>
 69     </bean> -->
 70    
 71     <!-- 配置多视图解析器:允许同样的内容数据呈现不同的view -->
 72     <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 73         <property name="favorParameter" value="true"/>
 74         <property name="defaultContentType" value="text/html"/>
 75         <property name="mediaTypes">
 76             <map>
 77                 <entry key="html" value="text/html;charset=UTF-8"/>
 78                 <entry key="json" value="application/json;charset=UTF-8"/>
 79                 <entry key="xml" value="application/xml;charset=UTF-8"/>
 80             </map>
 81         </property>
 82         <!--配置网页的视图解析器  -->
 83         <property name="viewResolvers">
 84             <list>
 85                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
 86                     <property name="prefix" value="/WEB-INF/jsp/"/>
 87                     <property name="suffix" value=".jsp"/>
 88                 </bean>       
 89             </list>
 90         </property>
 91     </bean>
 92    
 93     <!--  全局异常处理 -->
 94     <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 95         <property name="exceptionMappings">
 96             <props>
 97                 <prop key="java.lang.RuntimeException">error</prop>
 98             </props>
 99         </property>
100     </bean>
101    
102     <!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver --> 
103     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
104             <property name="maxUploadSize" value="5000000"/>
105             <property name="defaultEncoding" value="UTF-8"/>
106     </bean>
107    
108 </beans>
复制代码
复制代码

 

复制代码

 

 运行结果:

 

 

复制代码

 

posted on   ~码铃薯~  阅读(511)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示