SpringMVC

视频网址

一,基础

  • 环境搭建

    • 导入Spring的jar包和springmvc.jar
    • 在web.xml中加入下列内容,将所有请求拦截给SpringMVC处理
    
      		contextConfigLocation
      		classpath:springMVC.xml
      	
      	1
     
     
      	SpringDispatcherServlet
      	/
     
    
    • 创建前端index.jsp
    	跳转
    
    • 创建Springmvc文件,(Controller/Handler/Action)
      • 注解 @Contoller修饰类名.@RequestMapper(和前端对应)修饰方法名或类名
      • 配置
    1.	跳转
    @Controller
    public class SpringMVCController {
    
    	public SpringMVCController() {
    		// TODO Auto-generated constructor stub
    	}
    	@RequestMapping("welcome")
    	public String welcome() {
    		return "success";
    	}
    }
    
    2.	跳转
     @Controller
     @RequestMapping("Controller")
    public class SpringMVCController {
    
    	public SpringMVCController() {
    		// TODO Auto-generated constructor stub
    	}
    	@RequestMapping("welcome")
    	public String welcome() {
    	//默认使用请求转发
    		return "success";
    	}
    }
    
    • 创建springmvc.xml文件
      • 视图解析器+String字符创->默认使用了请求转发
    
    	
    	
    	
    		
    		
    	
    
  • 支持原生态servlet


注解

  • @RequestMapping:映射:
    • value=“跳转的url”,
    • method=RequestMethod.Post/Get/Delete/Put
    • params={“name[=/!=zs]”}->指定参数(==request.getParameter(“name”))[!/和参数值==“zs”.equals(request.getParameter(“zs”))]
    • headers={key=value}:请求头信息
    • PathVariable(“key”):与方法参数列表中对应的PathVariable(“key”)相同在,则将其值传递给修饰的参数
  • 获取前端传入的参数
    • @RequestMapping的PathVariable属性
    • 参数列表:(@RequestParam(“前端key”[, required=false(非必须),default=“默认值”]) 参数类型 参数名)
    • 参数列表:(@RequestHeader(“key”) 参数类型 参数名),获取请求头信息
    • 参数列表:(@CookieValue(“JSESSIONID”) String jsessionID),获取服务端响应给客户端cookie的jsessionID值
    • 使用类/对象接收请求参数:参数列表(实例类 参数名)实例属性必须和表单中的name值对应(支持级联属性)

模型

  • Controller向前端跳转带数据:返回对象-》ModelView ,参数-》 ModelMap, Map, Model,注解类=》@SessionAttributes, @ModelAttribute(用于更新)
  • 实现
    • 方式一:ModelAndView
//在Controller类中
@RequestMapping(value="test")
public ModelAndView test(){
    ModelAndView mv = new ModelAndView("success");//=>自动加前后缀,指明view
    Student stu = new Student(1,"zs",13);
    mv.addObject("student", stu);//String ,object=>request.setAttribute("student")
    return mv;
}
//前端
${requestScope.student.id}//=>1
  • 方式二:ModelMap
//在Controller类中
@RequestMapping(value="test")
public String test(ModelMap mm){
    Student stu = new Student(1,"zs",13);
    mm.put("student", stu);//request.setAttribute("student")
    return "success";
}
//前端
${requestScope.student.id}//=>1
  • 方式三:Map
//在Controller类中
@RequestMapping(value="test")
public String test(Map map){
    Student stu = new Student(1,"zs",13);
    map.put("student", stu);//request.setAttribute("student")
    return map;
}
//前端
${requestScope.student.id}//=>1
  • 方式四:Model
//在Controller类中
@RequestMapping(value="test")
public String test(Model model){
    Student stu = new Student(1,"zs",13);
    model.addAttribute("student", stu);//String ,object=>request.setAttribute("student")
    return model;
}
//前端
${requestScope.student.id}//=>1
  • 方式五:@SessionAttributes:在将实例对象放入request的同时,放入session
//在Controller类中
@SessionAttributes("name,name2")
@SessionAttributes(types= {Student.class, Address.class} )->将该类全部传入
//类名

@RequestMapping(value="test")
public String test(Model model){
    Student stu = new Student(1,"zs",13);
    model.addAttribute("student", stu);//String ,object=>request.setAttribute("student")
    return model;
}
//前端
${requestScope.student.id}//=>1
  • 方式五:@ModelAttribute:常用于更新->先查询获取原有记录,再对记录进行修改
    • 约定:map的key就是方法参数类型的首字母小写,自动传入值 或 通过方法参数ModelAttribute(“key”)
    • 默认任何一次当前controller类请求前都会使用(基于一个controller类对应一个功能的思想)

@ModelAttribute()->在任何一次请求之前
public void queryById(Map){
    Studnet stu = new Studnet()
    //....具体查询
    map.put("student" student);//->约定map的key就是方法参数类型的首字母,自动传入值
    
}
@RequestMapping(value="test")
public String test(Student stu){
    stu.setName("ls");
    return "success";
}
//前端
${requestScope.student.id}//=>1

ant风格

  • ?:0个或1个单字符
  • *:任意个字符
  • **:中间任意个目录
  • 通过PathVariable获取参数:前端在调用controller后面的内容传递个requestmapping中指定的值,将值传递给其修饰方法参数列表中相同key指定的参数
前端
欢迎
Controller
@RequestMapping(value="welcome/{name}")
public String welcome(@PathVarable("name") STtring name){
    syso(name)----->zs
    return "success";
}

Rest风格:软件编程风格

  • Spring mvc:

    • get:查
    • post:增
    • delet:删
    • put:改
  • 浏览器一般支持put,delete,通过过滤器(HiddenHttpMethodFilter)实现支持

    • 过滤器拦截条件

      • post请求,是隐藏域,名字为_method,value值就是post修改方式
      
       
      	  HiddenHttpMethodFilte
      	  org.springframework.web.filter.HiddenHttpMethodFilte
        
        
        	HiddenHttpMethodFilte
        	/*
        
      
  • 在Spring mvc中映射地址可以相同,根据请求方式区别(method=RequestMethod.请求方式)

实现国际化

  1. 创建资源文件
  • i18n_语言_地区.properties
  • i18n_语言.properties
//i18n_ch_CN.properties
welcome=你好的ascii码
exists=退出的ascii码
//i18n_en_USA.properties
welcome=welcome
exists=exists
  1. 配置spingmvc.xml,加载资源文件,通过id="messageSource"Springmvc会自动使用
//在Springmvc.xml中

    

  1. 使用,
//前端页面将jstl/fmt,引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>





//后端controller响应
@RequestMapping("testI18N")
public String test(){
    return "success";
}

视图解析器

  • 使用spring mvc实现jsp->jsp:这个注解会让所有请求转入mvc中匹配映射地址,忽略@RequestMapping

    
    
    
    
  • 设定跳转为请求转发或重定向:return “redirect/forward:前缀+页面+后缀”


静态资源处理

  • 直接访问静态资源,报错:404-》原因:所有请求被拦截交给SpringMVC的入口dispatcherServlet处理,找到对应的@RequestMapping处理,静态资源没有
  • 需要SpringMVC处理寻找对应的@RequestMapping()处理,没有则使用Tomcat默认的servlet处理
  • 默认servlet在tomcat的conf/web.xml中,中
  • 默认实现方式->Spring-mvc.xml中添加mvc:default-servlet-handler和 mvc:annotation-driver

类型转换器

  • Spring mvc内置有常见类型转换器,

  • 可以自定义类型转换器

    • 编写自定义类型转换器(实现Converter接口)
    public class Myconverter implements Converter {
    
    
    	public Myconverter() {
    		
    	}
    
    	public Student convert(String source) {
    		//接收前端传来的字符串
    		String[] studentInfo = source.split("-");
    		//将字段内容放到对象中对应的属性
    		Student student = new Student();
    		student.setId(Integer.parseInt(studentInfo[0]));
    		student.setName(studentInfo[1]);
    		student.setAge(Integer.parseInt(studentInfo[2]));
    		return student;
    	}
    
    }
    
    • 将自定义转换器加入SpringIOC容器中
    
    	
    	
    	
    		
    			
    				
    			
    		
    	
    	
    	
    

数据格式化

  • 在Springmvc.xml配置数据格式化注解所依赖的bean

    
    	
    	
    
  • 在使用的属性声明

    @DataTimeFormat(pattern="yyyy-MM-dd")=>传入2019-10-3=>thu dec 00:00:00 CST 2019
    private Date birtthday;
    @NumberFormat(pattern="###,#")->传入123,4=>1234
    

前端显示错误信息

  • 方法一
  • 在controller方法的参数中添加BingDingResult result,Map map,–> 顺序不能改变,BingdingResult保存前一个参数的错误信息
if(result.getErrorCount()>0){
    for(FiledError error:result.getFieldErrors()){
        map.put("errors", result.getFieldError);
    }
}
  • 在jsp显示

     ${error.getDefaultMessage()}

数据校验

  • 注解
    • @Null.为null
    • @NotNull,不为null
    • @AssertTrue,为true
    • @AssertFalse,为false
    • @Min(Value)/@DecimalMin(value),必须是数字,其值大于等于value
    • @Max(Value)/@DecimalMax(value),是数字,其值小于等于value
    • @Size(max,min),取值范围介于max和min
    • @Digits(interger,fraction),是数字,在可接受范围内
    • @Past:是一个过去的日期
    • @Future:是一个未来的日期
    • @Pattern(value):符合指定正则表达式
  • 扩展注释:
    • @Email:合法电子邮箱
    • @Length:字符串长度在指定范围
    • @NotEmpty:字符串非空
    • @Range:指定范围
  • 使用步骤
    • 导入jar包
    • 在Springmvc.xml中配置mvc:annontation-driver–>作用:Spirngmvc中实现校验,需要实现接口ValidatorFactory,SpringMVC提供了一个实现类LocalValidatorFactoryBea,这个注解在Springmvc中自动装配
    • 直接使用注解(实体类直接在属性前,Controller中直接在校验对象参数前)

Ajax处理json数据

  • 通过ajax请求Springmvc

//controller

@ResponseBody//通知SpringMVC,返回不是一个view。而是一个ajax,返回给调用的内容
@RequestMapping(value="testJson")
public List testJson(){
    //模拟调用service->List中三个学生对象:1-zs-15,2-za-14,3-ls-21
    List students = new ArrayList<>();
    return students
}


文件上传

  • 导入commons-io.jar,commons-fileupload.jar

  • SpringMVC实现文件上传必须实现MultipartResolver接口

  • 具体步骤(使用CommonsMultipartResolver)

    • 配置CommonsMultipartResolver
    • 将CommonsMultipartResolver配置入Springmvc.xml,bean的ID确定,SpringMVC自动寻找id
    
        
        
        
    
    
    • Controller中处理方法
public String upLoadFile(@RequestParam("desc") String desc,@RequestParam MultipartFile file){
    InputStream in = file.getInputStream();
    String name = file.getOriginalFilename();
    OutputStream out = new FileOutputStream(path+name);
    byte[] bs = new byte[1024];
    int len=-1;
    while( (len =in.read(bs) ) !=-1 ){
        out.write(bs,0,len);
    }
    out.close();
    in.close();
    return "success";
}

拦截器

  • 必须实现HandlerInterceptor接口
  • 方法:
    • preHandler():拦截客户端发送给服务端的请求
    • postHandle():拦截服务端发送给客户端的响应
    • afterCompletion():当响应经过处理形成页面就是渲染,渲染完毕后拦截
//拦截实现类
public class Myinterceptor implements HandlerInterceptor {

	public Myinterceptor() {}


	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("拦截渲染");
	}


	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("拦截响应");
	}


	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("拦截请求");
		//true:代表拦截后继续执行,false:拦截后中止请求
		return false;
	}

}
//sprinmvc.xml

	
		
		
		
		
			
			
			
			
			
		
		
	

异常处理

  • 异常处理必须实现HandlerInterceptor

  • @ExceptionHandler

    • 在处理异常的方法前注解@ExceprionHandler({异常类名.class}),传入参数为该异常的对象
    • 捕获该方法所在类中所有抛出的该异常
    • 如果想要该方法处理所有类异常,在处理异常的方法前家@ControllerAdvice
  • @ResponseStatus

    • 自定义异常页面
    • 注解@ResponseStatus(value=HTTPStatus(异常值),reason=“错误原因”),异常处理类前或异常处理方法前
    • 继承exception类
  • DefaultHandlerExceptionResolver:异常处理实现类,SpringMVC在常见异常基础上添加一些新的异常

  • SimpleMappingExceptionResolver:通过配置实现异常处理

    //springmvc.xml
    
        	
        	
        	
    			
    			
    				
    					error
    				
    				
    				
    					..
    				
    			
    		
    	
    

SSM整合

  • Spring-Spring MVC-mybatis
  • 思路
    • Spring->mybatis
      • 将mybatis的sqlSessionFactory交给spring
        • 导入jar包
        • 创建数据库表和表对应的类
        • mybatis配置文件交给sping->applicationConetext.xml
        • 配置Spring
        • 使用spring整合mybatis->扫描包
      • 整合Spring mvc至项目
        • 导入jar包
        • 配置Spring mvc->applicationContext-controller.xml,并将Spring mvc配置入web.xml
        • 编写applicationContext-controller.xml
//web.xml


  SSMExample
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  
  
 	
	
		contextConfigLocation
		classpath:applicationContext.xml
	

	
	
		org.springframework.web.context.ContextLoaderListener
	
  
  
	
		springDispatcherServlet
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:applicationContext-controller.xml
		
		1
	

	
	
		springDispatcherServlet
		url
	

//applicationContext-controller.xml


	
	
		
		
	
	
	
	

	
	

//applicationContext.xml



	
	
	
		
			
				classpath:db.properties
			
		
	
	
		
		
		
		
	
	
	
	
		
		
	
	
	
	
	
		
		
		
	
	
	
	
		
	
	



表单标签

  • Spring EL特点:
    • 支持各种类型的请求方法:(doGet,doPost,doDelete,doPut)
    • 可以绑定对象和属性
  • Spring mvc 会自动从名为command的对象中获取值->
//和表单对象绑定,支持多种请求
    
      //path和对象属性一一对应
      姓名:
年龄:
  • checkbox
    • 绑定方式
      • 通过boolean
      • 绑定集合(list,set)/数组的数据->和集合对应,集合中有则选中
      • (了解)嵌套对象的toString
  • checkboxes
    • 在COntroller中创建两个对应属性,一个是选中的,一个是所有选项,并将其放入request中
    • 如果标签名通过map,左边的是value,右边的标签名
    • 前端,未设置标签名默认是选项值
 //path对应实体类属性值,
  
  
  • radiobutton
    • path:绑定对象属性值,如果通过属性名获取的值和value对应,则选中
  • radiobuttons— delimter=“分隔符”
  • select:下列列表
    • 可以用items绑定可选项
    • 可以用子选项绑定可选项
    • 混合使用
    • 方式一,二优先使用一----方式二三,优先使用二----普通和SpingMVC的form:option则优先使用后者
方式一:

方式二:

    三

方式三:

    

你可能感兴趣的:(learning,diary,前端)