标签:日期 代码 其它 自定义 messages 内容 设置 stand resource
目录
springmvc.xml
<!--静态资源访问-->
<mvc:view-controller path="/hello" view-name="hello"/>
<mvc:annotation-driven />
当我们发送一个请求时,如果没有找到对应的mapping
则会对配置文件当中匹配mvc:view-controller
?
注意点:
添加后,原本自动生成的RequestMappingHandlerMapping会失效,也就不再自动生成
使用时要添加后面的内容
?
如果没有添加
则在使用@RequestMapping("testResult")的时候,会出现找不到结果页的错误
会自动注册三个Bean
?
并提供了:
? 数据绑定支持,
? @NumberFormatannotation支持,
? @DateTimeFormat支持,
? @Valid支持,读写XML的支持(JAXB),
? 读写JSON的支持(Jackson)。
<%@taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
创建表表单
表单
<a href="${pageContext.request.contextPath}/update">更新</a>
User类
package com.itlike.domain;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
@Setter@Getter
public class User {
@NotBlank(message = "姓名不能为空")
String username;
@Max(value = 200,message = "年龄不正确")
Integer age;
Integer gender;
String[] hobby;
Pet pet;
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", gender=" + gender +
", hobby=" + Arrays.toString(hobby) +
", pet=" + pet +
'}';
}
}
Pet类
package com.itlike.domain;
import lombok.Getter;
import lombok.Setter;
@Setter@Getter
public class Pet {
private String name;
private Integer id;
@Override
public String toString() {
return "Pet{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
}
?
@Controller
public class MyController {
@RequestMapping("update")
public String update(Model model) {
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add("篮球");
arrayList.add("足球");
arrayList.add("乒乓球");
model.addAttribute("allhobby", arrayList);
ArrayList<Object> petList = new ArrayList<>();
Pet pet1 = new Pet();
pet1.setId(1);
pet1.setName("狗");
Pet pet2 = new Pet();
pet2.setId(2);
pet2.setName("猫");
Pet pet3 = new Pet();
pet3.setId(3);
pet3.setName("老虎");
petList.add(pet1);
petList.add(pet2);
petList.add(pet3);
model.addAttribute("petList", petList);
User user = new User();
user.setUsername("itlike");
user.setAge(10);
user.setGender(1);
String[] hobby = new String[]{"篮球", "足球"};
user.setPet(pet2);
user.setHobby(hobby);
model.addAttribute("user", user);
return "/result.jsp";
}
}
<h1>结果页-------------</h1>
<fm:form modelAttribute="user" action="${pageContext.request.contextPath}/update2">
姓名:<fm:input path="username"/> <fm:errors path="username" cssStyle="color: red"/><br>
年龄:<fm:input path="age"/> <fm:errors path="age" cssStyle="color: red"/><br>
性别:<fm:radiobutton path="gender" value="0" label="男"/>
<fm:radiobutton path="gender" value="1" label="女"/><br>
爱好:<fm:checkboxes path="hobby" items="${allhobby}"/> <br>
宠物:<fm:select path="pet.id" items="${petList}" itemValue="id" itemLabel="name"/> <br>
<input type="submit" value="修改">
</fm:form>
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
classmate.jar
hibernate-validator-5.jar
hibernate-validator-annotation-processor-5.jar
jboss-logging-3.1.1.jar
validation-api-1.1.0.jar
? 在配置文件当中写上
? User类
@Setter@Getter
public class User {
@NotNull
String username;
@Max(value = 200,message = "请输入合法的年龄")
Integer age;
@Email(message = "请输入正确的邮箱")
private String email;
@Pattern(regexp="^1(3|4|5|7|8)\\d{9}$",message="请输入正确的手机号")
private String phone;
}
RequestMapping("update2")
public String update2(@Valid User user, BindingResult result,Model model) {
int errorCount = result.getErrorCount();
if(errorCount != 0)
{
//获取校验错误字段及错误信息
List<FieldError> fieldErrors = result.getFieldErrors();
for(FieldError fieldError:fieldErrors)
{
System.out.println(fieldError.getField()+":"+fieldError.getDefaultMessage());
//这句话其实可写可不写,因为数据是会自动包装在model中的
model.addAttribute(fieldError.getField(),fieldError.getDefaultMessage());
}
}
//判断有没有错误信息
if(result.getErrorCount() != 0){
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add("篮球");
arrayList.add("足球");
arrayList.add("乒乓球");
model.addAttribute("allhobby", arrayList);
ArrayList<Object> petList = new ArrayList<>();
Pet pet1 = new Pet();
pet1.setId(1);
pet1.setName("狗");
Pet pet2 = new Pet();
pet2.setId(2);
pet2.setName("猫");
Pet pet3 = new Pet();
pet3.setId(3);
pet3.setName("老虎");
petList.add(pet1);
petList.add(pet2);
petList.add(pet3);
model.addAttribute("petList", petList);
//回到原来界面
return "/result.jsp";
}
return "/result2.jsp";
}
?
<fm:form modelAttribute="user" action="${pageContext.request.contextPath}/update2">
姓名:<fm:input path="username"/> <fm:errors path="username" cssStyle="color: red"/><br>
年龄:<fm:input path="age"/> <fm:errors path="age" cssStyle="color: red"/><br>
性别:<fm:radiobutton path="gender" value="0" label="男"/>
<fm:radiobutton path="gender" value="1" label="女"/><br>
爱好:<fm:checkboxes path="hobby" items="${allhobby}"/> <br>
宠物:<fm:select path="pet.id" items="${petList}" itemValue="id" itemLabel="name"/> <br>
<input type="submit" value="修改">
</fm:form>
<fm:error path="username"></fm:error>
/*
拦截所有 jsp js png .css 真的全拦截.不建议使用
/
拦截所有,不包括jsp,包含.js .png.css 建议使用
*.action 或 *.do
拦截以do action 结尾的请求
<mvc:annotation-driven />
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
? 通过@ResponseBody来实现;注解方式
? 1.添加json处理相关jar包
?
jackson-annotations-2.9.4.jar
jackson-core-2.9.4.jar
jackson-databind-2.9.4.jar
?
? 2.在配置文件当中写上
? 3.设置映射方法的返回值为@ResponseBody
? 方式1-直接返回一个对象
//返回是json格式
@RequestMapping("getJson")
public @ResponseBody User getJson(){
User user = new User();
user.setUsername("itlike");
user.setAge(18);
return user;
}
? 方式2-返回一个List集合
?
@RequestMapping("formJson")
@ResponseBody
public List<User> formJson(){
User user1 = new User();
user1.setName("le");
user1.setAge(14);
User user2 = new User();
user2.setName("leo");
user2.setAge(18);
ArrayList<User> arrayList = new ArrayList<>();
arrayList.add(user1);
arrayList.add(user2);
return arrayList;
}
? 方式3-返回一个Map集合
@RequestMapping("formJson")
@ResponseBody
public Map<String,Object> formJson(){
User user1 = new User();
user1.setName("le");
user1.setAge(14);
User user2 = new User();
user2.setName("leo");
user2.setAge(18);
Map<String,Object> hashMap = new HashMap<>();
hashMap.put("user1",user1);
hashMap.put("user2",user2);
return hashMap;
}
<form id="myform">
user:<input type="text" name="username"><br>
age:<input type="text" name="age" ><br>
爱好:<input type="checkbox" name="hobby" value="篮球"> 篮球
<input type="checkbox" name="hobby" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobby" value="足球"> 足球
</form>
<input type="button" id="formbtn" value="发送form">
?
(function($){
$.fn.serializeJson=function(){
var serializeObj={};
var array=this.serializeArray();
var str=this.serialize();
$(array).each(function(){
if(serializeObj[this.name]){
if($.isArray(serializeObj[this.name])){
serializeObj[this.name].push(this.value);
}else{
serializeObj[this.name]=[serializeObj[this.name],this.value];
}
}else{
serializeObj[this.name]=this.value;
}
});
return serializeObj;
};
})(jQuery);
?
$("#submit_btn").click(function () {
var url = "${pageContext.request.contextPath}/testAjax";
var jsonString = {username:"le",age:10};
$.ajax({
type:"post",
url:url,
data:JSON.stringify(jsonString),
success:function (data) {
alert(data)
}
});
};
@RequestMapping("testAjax")
public String testAjax(@RequestBody User user){
System.out.println(user);
return "success";
}
<form action="${pageContext.request.contextPath}/myform" method="post" enctype="multipart/form-data">
<input type="file" name="myfile"> <br>
<input type="submit" value="提交">
</form>
@RequestMapping("myfile")
public String myform(@RequestBody String body){
System.out.println(body);
return "body";
}
?
源码分析(执行DispatcherServlet)
? 1.获取mapping映射
? 2.获取适配器
? 3.调用处理器,执行映射方法,返回MV(即ModelAndView,模型视图)
? 4.处理转发页面
? 5.在方法内部渲染页面
? 6.创建视图对象
? 7.调用View对象渲染页面
? 8.在render内部解析数据
? 9.转发到jsp页面
示例
//匹配.jpg .png等文件
@RequestMapping("/download/{filename:.+}")
public ResponseEntity download(@PathVariable String filename, HttpSession session) throws Exception {
System.out.println(filename);
//1.获取文件路径
ServletContext servletContext = session.getServletContext();
String realPath = servletContext.getRealPath("/download/" + filename);
//2.把文件读取程序当中
InputStream io = new FileInputStream(realPath);
byte[] body = new byte[io.available()];
io.read(body);
//3.创建响应头
HttpHeaders httpHeaders = new HttpHeaders();
filename = URLEncoder.encode(filename,"UTF-8");
httpHeaders.add("Content-Disposition","attachment;filename="+filename);
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(body, httpHeaders, HttpStatus.OK);
return responseEntity;
}
?
1.导入相关jar包
com.springsource.org.apache.commons.fileupload-1.2.0.jar
com.springsource.org.apache.commons.io-1.4.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
2.在springmvc配置文件当中装配MultipartResovler
<!--上传文件配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="102400"/>
</bean>
3.实现上传代码
@RequestMapping("/upload")
public String upload(@RequestParam("file") CommonsMultipartFile file,HttpSession session) throws IOException {
System.out.println(file.getContentType());
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());
System.out.println(file.getName());
//确定上传的路径
ServletContext servletContext = session.getServletContext();
String realPath = servletContext.getRealPath("/upload");
//变成程序当中的路径
File uploadPath = new File(realPath);
if(!uploadPath.exists()){//如果路径不存在 ,创建一个新的
uploadPath.mkdirs();
}
//确认最终的路径 /文件夹/文件名 工程的名称/upload/java.png
String fileName = file.getOriginalFilename();
uploadPath = new File(uploadPath+"/"+fileName);
//开始上传
file.transferTo(uploadPath);
return "result.jsp";
}
? WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件
? 处理 Handler 中用 @ExceptionHandler 注解定义的方法。
@RequestMapping("exception")
public String exception(){
int i = 1 / 0;
return "result.jsp";
}
@ExceptionHandler(value = ArithmeticException.class)
public String doexception(Exception ex){
System.out.println("出现异常:"+ex.getMessage());
return "/error.jsp";
}
?
@ExceptionHandler(value = ArithmeticException.class)
public String doexception(Exception ex){
System.out.println(ex.getMessage());
return "error";
}
@ExceptionHandler(value = RuntimeException.class)
public String doexception2(Exception ex){
System.out.println(ex.getMessage());
return "error";
}
@ExceptionHandler(value = Exception.class)
public String doexception3(Exception ex){
System.out.println(ex.getMessage());
return "error";
}
如果在当前类中没有找到@ExceptionHanler
则会到@ControllerAdvice 中的@ExceptionHandler 注解方法
ExceptionController类
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = Exception.class)
public String doexception3(Exception ex){
System.out.println(ex.getMessage());
System.out.println("ExceptionController");
return "error";
}
}
?
? message_zh_CN.properties
language.cn=中文
language.en=英文
welcome=欢迎
name=乐乐
? message_en_US.properties
language.cn=China
language.en=English
welcome=welcome
name=le
?
<mvc:annotation-driven />
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
</bean>
jstl.jar
standard.jar
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<fmt:message key="welcome" /></a>
<fmt:message key="le" /></a>
<hr>
<spring:message key="welcome"/>
<spring:message key="le"/>
?
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
</bean>
<!--配置session本地解析器-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language"/>
</bean>
<!--自定义 拦截器 拦截所有请求-->
<!-- <bean class="com.le.web.interceptor.MyFirstInterceptor"></bean>-->
<mvc:interceptor>
<mvc:mapping path="/local"/>
<!--除了指定的请求不拦截,其它 的都拦截-->
<!--<mvc:exclude-mapping path=""/>-->
<bean class="com.le.web.interceptor.MyFirstInterceptor"></bean>
</mvc:interceptor>
<bean class="com.le.web.interceptor.MySecInterceptor"/>
</mvc:interceptors>
?
? language_zh_CN.properties
language.cn=中文
language.en=英文
welcome=欢迎
name=乐乐
? language_en_US.properties
language.cn=China
language.en=English
welcome=welcome
name=le
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<a href="?language=zh_CN"><spring:message code="language.cn" /></a>
<a href="?language=en_US"><spring:message code="language.en" /></a>
<hr>
<h1>
<spring:message key="welcome"/><br>
<spring:message key="name"/>
</h1>
preHandle()
在业务处理器处理请求之前被调用
postHandle
在业务处理器处理完请求后
afterCompletion
在 DispatcherServlet 完全处理完请求后被调用
? MyFirstInterceptor类
package com.itlike.web.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstInterceptor implements HandlerInterceptor {
@Override
//当处理器方法执行之前调用
//返回值: true 放行 false 不放行 就执行不了处理器方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle当处理器方法执行之前调用1");
return true;
}
@Override
//当处理器方法执行之后会自动调用调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle当处理器方法执行之后会自动调用调用1");
}
@Override
//请求处理完毕之后, 会调用
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion请求处理完毕之后,会调用1");
}
}
? MySecInterceptor类
package com.itlike.web.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MySecInterceptor implements HandlerInterceptor {
@Override
//当处理器方法执行之前调用
//返回值: true 放行 false 不放行 就执行不了处理器方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle当处理器方法执行之前调用2");
return false;
}
@Override
//当处理器方法执行之后会自动调用调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle当处理器方法执行之后会自动调用调用2");
}
@Override
//请求处理完毕之后, 会调用
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion请求处理完毕之后会调用2");
}
}
<mvc:interceptors>
<bean class="com.itlike.web.interceptor.MyFirstInterceptor"></bean>
</mvc:interceptors>
<mvc:interceptors>
<bean class="com.itlike.web.interceptor.MyFirstInterceptor"></bean>
<mvc:interceptor>
<!--设置拦截哪些请求-->
<mvc:mapping path="/hello"/>
<!--除了指定的请求不拦截,其它 的都拦截-->
<mvc:exclude-mapping path="/hello2"/>
<bean class="com.itlike.web.interceptor.MySecInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
?
标签:日期 代码 其它 自定义 messages 内容 设置 stand resource
原文地址:https://www.cnblogs.com/mumuyinxin/p/10921776.html