北京高端网站,什么是网络营销中的广告联盟,网站建立的步骤是( ),seo自动推广软件InitBinder注解来绑定表单数据 在使用SpingMVC框架的项目中#xff0c;经常会遇到页面日期时间类型的数据要绑定到控制器的实体#xff0c;或者控制器需要接受这些数据#xff0c;如果这类数据类型不做处理的话将无法绑定,而日期型当作字符串类型一点没问题。 这里我…InitBinder注解来绑定表单数据 在使用SpingMVC框架的项目中经常会遇到页面日期时间类型的数据要绑定到控制器的实体或者控制器需要接受这些数据如果这类数据类型不做处理的话将无法绑定,而日期型当作字符串类型一点没问题。 这里我们可以使用注解InitBinder来解决这些问题这样SpingMVC在绑定表单之前都会先注册这些编辑器。一般会将这些方法些在BaseController中需要进行这类转换的控制器只需继承BaseController即可。Spring自己提供了大量的编辑器实现类诸如CustomDateEditor CustomBooleanEditorCustomNumberEditor等许多基本上够用。 1.需要在SpringMVC的配置文件加上 如果要格式化并且转换数据类型的话加上服务该服务为3中配置的格式化数据且转换数据类型的bean mvc:annotation-driven conversion-serviceconversionService/mvc:annotation-driven2.有这些日期这些特殊类型的绑定需求的Contoller类上继承BaseController 3.springmvc.xml中配置数据类型转换器bean要用FormattingConversionServiceFactoryBean !-- 配置自定义的数据类型转换器 ,这个bean还要放在上面的mvc:annotation-driven里即要格式化还要转换数据类型的话要用到FormattingConversionServiceFactoryBean--!--bean idconversionService classorg.springframework.context.support.ConversionServiceFactoryBean --bean idconversionService classorg.springframework.format.support.FormattingConversionServiceFactoryBeanproperty nameconverterssetbean classcn.ybzy.sshweb.web.StringConvetUser/bean/set/property/bean例:用户类中有一个出生日期
我们来进行增加修改等操作。 User.java(参考自已做的项目sshweb---sts3.9开发工具在百度网盘中有 该项目使用spring,springmvc,hibernate框架.
public class User {private int id;private String username;private String password;private Department dpt; //部门// DateTimeFormat(patternyyyy-MM-dd)这个可以替代InitBinder注解的方法private Date birthday; //java.util.*//GET,SET,TOSTIRNG无参构造等方法
}
-------------------------------User.hbm.xml---------------------------------------
hibernate-mappingclass namecn.ybzy.sshweb.model.User tablet_usersid nameid typeintcolumn nameid /generator classnative //idproperty nameusername typejava.lang.Stringcolumn nameusername //propertyproperty namepassword typejava.lang.Stringcolumn namepassword //propertymany-to-one namedpt classcn.ybzy.sshweb.model.Department fetchjoincolumn namedpt_id //many-to-oneproperty namebirthday typejava.util.Datecolumn namebirthday/column/property/class
/hibernate-mappingusers.jsp显示所有用户信息,addUserView.jsp,updateUserView.jsp
bodyh4显示所有用户信息/h4table border1trtdid/tdtd用户名/tdtd用户密码/tdtd用户部门/tdtd生日/tdtd对用户进行操作/td/trc:forEach varuser items${users} !-- users 在控制类中映射数据据表通过Model注入到了域中 --trtd${user.id }/tdtd${user.username }/tdtd${user.password }/tdtd${user.dpt.dptName }/tdtd${user.birthday }/tdtda href${pageContext.request.contextPath}/user/${user.id}修改/aa classdelete href${pageContext.request.contextPath}/user/${user.id} 删除/a/td/tr/c:forEach/tableh4自定义数据类型转换器如下把几个字段封装成一个对象/h4form action${pageContext.request.contextPath }/convetUser methodpost字符串形式的User(username,password,dpt_id)id自增input typetext nameuserbrinput typesubmit value提交/form
/body
---------------------------------------------addUserView.jsp-----------
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%% taglib prefixform urihttp://www.springframework.org/tags/form %
html
head
meta http-equivContent-Type contenttext/html; charsetUTF-8
title添加用户/title
/head
bodyh4添加用户/h4
form:form action${pageContext.request.contextPath}/user用户名 form:input pathusername/brbr密码 form:input pathpassword/brbr生日 form:input pathbirthday/brbr部门 form:select pathdpt.id itemValueid itemLabeldptName items${dpts}/form:selectbrbrinput typesubmit value添加用户//form:form
/body
/html
--------------------------------UpdateUserView.jsp-------------------------------------
bodyh4修改用户信息/h4form:form action${pageContext.request.contextPath}/user methodput modelAttributeuser用户号 form:hidden pathid/brbr密码 form:input pathpassword/brbr生日 form:input pathbirthday/brbr部门 form:select pathdpt.id itemValueid itemLabeldptName items${dpts}/form:selectbrbrinput typesubmit value提交修改//form:form
/bodyBaseController.java
import java.text.SimpleDateFormat;
import java.util.Date;import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
/** 该控制类是由其它控制要用到处理日期格式时用 extends 继之用* // DateTimeFormat(patternyyyy-MM-dd)这个可以替代InitBinder注解的方法参考User.java的brithday字段的注解*/
public class BaseController {InitBinderpublic void InitBinder(WebDataBinder binder) {/*WebDataBinder是用来绑定请求参数到指定的属性编辑器由于前台传到controller里的值是String类型的当往Model里Set这个值的时候如果set的这个属性是个对象spring就会找到对应的editor进行编辑转换然后再set进去。需要在Springmvc.xml中加上mvc:annotation-driven /事实上这是一新建项目就加了。*/SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd);sdf.setLenient(false); //false:日期格式遵守严格格式如:2025-07-33会报错如果true, 会自动转换成2025-08-02binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));}}UserController.java
Controller
public class UserController extends BaseController {Autowiredprivate UserService userService;Autowiredprivate DepartmentService departmentService;/*** rest风格,传统风格是getAll方法访问这里是直接输入用户可获取。* url: xxxx/users 请求方法为get,获取所有用户* return*/RequestMapping(value/users,methodRequestMethod.GET)public String getAllUsers(Model model) {ListUser users userService.getAllUsers();model.addAttribute(users,users);return users; //返回到users.jsp页面中}
//Rest风格修改一条记录有两步一先获取到一条记录二再真正修改记录/***符合rest风格 : /user/1获取到第一条的一条记录get请示.例在users.jsp列表页中点击第行的修改会链接成/user/1,* param id* param model* return*/RequestMapping(value/user/{id},methodRequestMethod.GET)public String updateUserView(PathVariable(id) Integer id,Model model) {if(id!null) {User useruserService.getOne(id);model.addAttribute(user,user);}ListDepartment dpts departmentService.getAllDepartment();model.addAttribute(dpts,dpts);return updateUserView; //获取一条记录到修改页}ModelAttributepublic void getUser(RequestParam(valueid,requiredfalse) Integer id,RequestParam(valuedpt.id,requiredfalse) Integer dptid,Model model){if(id!null dptid!null) {User useruserService.getOne(id);Department dpt departmentService.getOne(dptid);user.setDpt(dpt);model.addAttribute(user,user);}}/*** 真正修改rest风格 /user控制层,PUT请示方式* param user* return*/RequestMapping(value/user,methodRequestMethod.PUT)public String updateUser(User user) { //自动获取由updateUserView.jsp提交的信息封装到user对象中System.out.println(修改前获取到的一条User对象记录user); //因为获取到的user对象中username为null和关联部门的部门名为null,所以不可用它修改//1。传统方法修改/*User user2 userService.getOne(user.getId());Department dpt2departmentService.getOne(user.getDpt().getId());user2.setPassword(user.getPassword());user2.setDpt(dpt2);System.out.println(user2user2);userService.update(user2);*///2.springmvc利用注解ModeAttribute,另定义一方法获取完整的User对象与本方法中的user对角自动补全去掉nulluserService.update(user);return redirect:/users; //修改成功跳转到列表页users.jsp}/** REST*/RequestMapping(value/user,methodRequestMethod.GET)public String addUserView(Model mode) {mode.addAttribute(command,new User());mode.addAttribute(dpts, departmentService.getAllDepartment());return addUserView;}RequestMapping(value/user,methodRequestMethod.POST)public String addUser(User user) {userService.add(user);System.out.println(增加用户user);return redirect:/users;}/** rest风格删除一条用户记录* */RequestMapping(value/user/{id},methodRequestMethod.DELETE)public String deleteUser(PathVariable(valueid) Integer id) {if(id!null) {//System.out.println(userService.delete中的idid);userService.delete(id);}return redirect:/users;}RequestMapping({ /index, /, }) // 为了测试方例我只要输入项目名即可转到index.jsp页中public String index() {return index;}
}
如果没有写相应的BaseController.java,那么就要在增加修改方法中用字段接收之但这样就失去了我们的springmvc的便利性即增加时可能会出现问题 如我们输入1999-01-01,会不出现秒时分等。 写了的话话再继承的话就是如下两图所示
用DateTimeFormat注解代替initBinder注解及方法这个用的更多 JSR-303 Validation验证 一、JSR-303简介 JSR-303只是一个规范而Spring也没有对这一规范进行实现那么当我们在SpringMVC中使用JSR-303的时候就需要我们提供一个对JSR-303规范的实现Hibernate Validator就是实现了这一规范的具体框架。这个和Hibernate ORM框架没关系啊 JSR-303的校验是基于注解的它内部已经定义好了一系列的限制注解我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。 二、JSR 303 基本的校验规则
空检查 Null 验证对象是否为null NotNull 验证对象是否不为null, 无法查检长度为0的字符串 NotBlank 检查约束字符串是不是Null还有被Trim后的长度是否大于0,只对字符串,且会去掉前后空格. NotEmpty 检查约束元素是否为NULL或者是EMPTY.Booelan检查 AssertTrue 验证 Boolean 对象是否为 true AssertFalse 验证 Boolean 对象是否为 false长度检查 Size(min, max) 验证对象Array,Collection,Map,String长度是否在给定的范围之内 Length(min, max) Validates that the annotated string is between min and max included.日期检查 Past 验证 Date 和 Calendar 对象是否在当前时间之前验证成立的话被注释的元素一定是一个过去的日期 Future 验证 Date 和 Calendar 对象是否在当前时间之后 验证成立的话被注释的元素一定是一个将来的日期 Pattern 验证 String 对象是否符合正则表达式的规则被注释的元素符合制定的正则表达式regexp:正则表达式 flags: 指定 Pattern.Flag 的数组表示正则表达式的相关选项。数值检查 建议使用在Stirng,Integer类型不建议使用在int类型上因为表单值为“”时无法转换为int但可以转换为Stirng为”“,Integer为null Min 验证 Number 和 String 对象是否大等于指定的值 Max 验证 Number 和 String 对象是否小等于指定的值 DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 Digits 验证 Number 和 String 的构成是否合法 Digits(integer,fraction) 验证字符串是否是符合指定格式的数字interger指定整数精度fraction指定小数精度。 Range(min, max) 被指定的元素必须在合适的范围内 Range(min10000,max50000,message”range.bean.wage”) Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) CreditCardNumber信用卡验证 Email 验证是否是邮件地址如果为null,不进行验证算通过验证。 ScriptAssert(lang ,script, alias) URL(protocol,host, port,regexp, flags) 三导包
dependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator/artifactIdversion6.0.10.Final/version
/dependency
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator-annotation-processor/artifactIdversion6.0.10.Final/version
/dependency例我们只对添用户作了有效性验证 User.java
public class User {private int id;NotEmpty //不能為空也不能為空格這個用javax.validation.constraints.NotEmpty;private String username;NotEmptyprivate String password;NonNullprivate Department dpt; //部门Past//DateTimeFormat(patternyyyy-MM-dd)//这个可以替代InitBinder注解的方法private Date birthday;Emailprivate String email;//....get,set,toString()等方法
}UserController.java---添加用户方法作修改
Controller
public class UserController extends BaseController {Autowiredprivate UserService userService;Autowiredprivate DepartmentService departmentService;RequestMapping(value/user,methodRequestMethod.GET) //REST风格添加记录首先用get方式http://localhost/sshweb/user,到达添加页面public String addUserView(Model mode) {mode.addAttribute(user,new User());//這是springmvc的表單要的不然會出錯當表單提交接的是空的時候mode.addAttribute(dpts, departmentService.getAllDepartment());return addUserView;}RequestMapping(value/user,methodRequestMethod.POST) public String addUser(Valid User user,Errors err,Model model) {if(err.getErrorCount()0) {System.out.println(某些數據不符合數據有效性校驗);for(FieldError fe:err.getFieldErrors()) {System.out.println(fe.getField():fe.getDefaultMessage());}model.addAttribute(dpts,departmentService.getAllDepartment());return addUserView;}userService.add(user);return redirect:/users;}
}addUserView.jsp
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%% taglib prefixform urihttp://www.springframework.org/tags/form %
html
head
meta http-equivContent-Type contenttext/html; charsetUTF-8
title添加用户/title
/head
bodyh4添加用户/h4
form:form action${pageContext.request.contextPath}/user modelAttributeuser 用户名 form:input pathusername/form:errors pathusername/form:errorsbrbr密码 form:input pathpassword/form:errors pathpassword/form:errorsbrbr生日 form:input pathbirthday/form:errors pathbirthday/form:errorsbrbr郵箱 form:input pathemail/brform:errors pathemail/form:errorsbr部门 form:select pathdpt.id itemValueid itemLabeldptName items${dpts}/form:selectform:errors path/form:errorsbrbrinput typesubmit value添加用户//form:form
/body
/html测试localhost:8081/sshweb/user—打开添加页面 有些系统默认的错误信息不好用我们一般都自己写错误提示信息 ①用注解在注解中带message参数 ②用国际化配置文件i18n.properties注意这个你的自定义的错误信息会覆盖注解上自定义的错误信息 如下图当日期输出错误时显示的信息很不友好 处理方法 重启动统再添加用户信息故意设置错误可以看到如下信息。
SpringMVC返回json数据的方法 JSONJavaScript Object NotationJavaScript对象表示法是基于ECMAScript的一个子集设计的是一种开放标准的文件格式和数据交换格式它易于人阅读和编写同时也易于机器解析和生成。 一个无序的键值对集合。 以下是一个包含各种类型和结构的JSON示例
var s{
title:JSON Example,author: {name:John Doe,age: 35,isVerified:true},
tags:[json, syntax, example],rating: 4.5,isPublished:false,comments: null
}这种格式通常与ajax技术一起用如股票实时更新场景。springmvc返回的是web页面形式的数据如html格式xml格式我们如何返回json格式数据呢。 方式一使用JSON工具将对象序列化成json常用工具Jacksonfastjsongson。然后利用HttpServletResponse然后获取response.getOutputStream()或response.getWriter()直接输出。 1. 导包
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.9.6/version
/dependency
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactIdversion2.9.6/version
/dependency
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.6/version
/dependency2.写控制类JsonTestController.java,页面jsonTestViest.jsp JsonTestController.java
Controller
public class JsonTestController {Autowiredprivate UserService userService;RequestMapping(value/testjson,methodRequestMethod.POST)public void testjson(HttpServletResponse resp,PrintWriter out) throws JsonProcessingException {resp.setContentType(application/json;charsetutf-8);resp.setHeader(pragma, no-cache);resp.setHeader(cache-control, no-cache);ListUser users userService.getAllUsers();ObjectMapper mappernew ObjectMapper();String jsonStrmapper.writeValueAsString(users);System.out.println(json格式的所有用户信息jsonStr);out.print(jsonStr); //向浏览器响应了json格式数据jsonTestView.jsp)}RequestMapping(/jsontestview) //起进入jsonTestView.jsp页面的作用public String jsonTestView() {return jsonTestView;}}jsonTestVIew.jsp
script typetext/javascript src${pageContext.request.contextPath}/resources/js/jq/jquery-1.12.4.min.js/script
script typetext/javascript$(function(){//alert(xiong);$(#jsonid).click(function(){var hrefthis.href;var args {};//ajaxhref目的地;args:带出去的参数;data目标方法返回的值$.post(href,args,function(data){for(var i0;idata.length;i)alert(data[i].username);});return false; //a 标签原来的功能失效});});/script
/head
bodya idjsonid href${pageContext.request.contextPath}/testjsonjson Test jsp a/a
/body
/html测试进入页面是由控制层的映射到jsonTestVIew.jsp页中localhot:8081/sshweb/jsontestview回车进入页面点击链接会显示如下图所示内 问题hibernate懒加载民常由于没有关闭懒加载所以当我们一访问用户时首先打访问用户信息 而关联的部门信息会延迟加载但是这里我们是用json时会因为没有部门信息而发生异常所以我们要在User.hmb.xml中的多对一字段中加lazy“false” 方式二前面的方法太老土了我们使用SpringMVC它给我们提供更傻的方式只需要用一个注解ResponseBody就搞定
Controller
public class JsonTestController {Autowiredprivate UserService userService;ResponseBodyRequestMapping(value/testjson2,methodRequestMethod.POST)public ListUser testjson2() {ListUser users userService.getAllUsers();return users;}RequestMapping(/jsontestview)public String jsonTestView() {return jsonTestView;}}springMVC中框架对HttpMessageConverter的选择原理 在SpringMVC的 Controller层经常会用到RequestBody和ResponseBody通过这两个注解可以在Controller中直接使用Java对象作为请求参数和返回内容(这里直接将返回内容直接写入到Response对象的body数据区从而绕过来前面我们讲的视图解析器不通过视图解析器直接将数据响应给浏览器)而在写入之前必须要转换响应的数据格式完成这之间转换作用的便是HttpMessageConverter。