• SpringMVC


    SpringMVC学习笔记(一)

    一、SpringMVC基础入门,创建一个HelloWorld程序

    1.首先,导入SpringMVC需要的jar包。

    2.添加Web.xml配置文件中关于SpringMVC的配置
    <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
    		<!--向服务器注册前端控制器!  -->
    		<servlet>
    			<servlet-name>springDispatcherServlet</servlet-name>
    			<!--DispatcherServlet指的是SpringMVC的前端控制器!,给服务器使用,创建servlet对象!  -->
    			<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    			<!-- 初始化参数contextConfigLocation用于指定SpringMVC配置文件的路径以及名称 -->
    			 <init-param>
    				<param-name>contextConfigLocation</param-name>
    				<param-value>classpath:springmvc.xml</param-value>
    			</init-param>
    			<!-- 数字0或者大于0的数字表示的是:在服务器启动的时候创建Servlet对象,而不是第一次访问的时候创建
    				小于0的数字指的是:在第一次访问的时候创建Servlet对象.
    				在数字大于O的情况下,数字越小,优先级越高!
    			 -->
    			<load-on-startup>1</load-on-startup>
    		</servlet>
    
    		<!-- Map all requests to the DispatcherServlet for handling -->
    		<!-- 用 servlet-mapping指定请求映射的路径-->
    		<servlet-mapping>
    			<servlet-name>springDispatcherServlet</servlet-name>
    			<!-- 用url-pattern指定拦截 的请求路径! -->
    			<url-pattern>/</url-pattern>
    		</servlet-mapping>
    

    3.在src下添加springmvc.xml配置文件

    注意:1).创建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
    2).我们创建SpringMVC配置文件的时候使用的是Spring Bean Configuration File创建的,不是XML!,同时配置视图解析器
     <!-- 配置SpringMVC容器要扫描的包 -->
       <context:component-scan base-package="com.neuedu.controller"></context:component-scan>
       <!--InternalResourceViewResolver  是视图解析器 ,将逻辑视图转换成物理视图,然后显示真正的视图,也就是说具体步骤:前缀 + 方法的返回值 + 后缀-->-->
       <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀--> <property name="prefix" value="/WEB-INF/view/"></property>
    <!--后缀-->
    <property name="suffix" value=".jsp"></property>
    </bean>

    4.在WEB-INF文件夹下创建名为view的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中添加“Hello World”。

    5.在springMVC扫描的包下创建控制器类[Controller/Handler],注意要加入@Controller注解

    6.编写Controller代码

    @Controller
    public class AController {
    /** * 我们通过@RequestMapping做请求URL的映射! * @return */ @RequestMapping("/sayHello") public String sayHello(){ return "hello"; }
    }
    注意:在类的方法上我们使用的是@RequestMapping,然后在括号里指定请求url的请求路径!

    7.启动服务器,键入 http://localhost:8080/项目名/sayHello

    、请求一个SpringMVC的流程

    三、SpringMVC运行原理

    1. 客户端请求提交到DispatcherServlet
    2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
    3. DispatcherServlet将请求提交到Controller
    4. Controller调用业务逻辑处理后,返回ModelAndView
    5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
    6. 视图负责将结果显示到客户端

    四、配置解析

    1.配置前端控制器【DispatcherServlet

      DispatcherServlet是前端控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步,也就是对应SpringMVC运行原理中的一;

    2.@Controller

          在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

    3.InternalResourceViewResolver----视图名称解析器

    控制器Controller在处理由DispatcherServlet 分发的请求后,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示,一般是先返回daoDispatcherServlet 的视图解析器,进行解析;

    五、SpringMVC常用注解

    @Controller

      在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器,

    @RequestMapping 

    Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求

     1). 在控制器的类定义及方法定义处都可标注

    – 类定义处:提供初步的请求映射信息。相当于当前 WEB 应用的根目录
    – 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。
    若 类定义处未标注 @RequestMapping,则方法处标记的 URL 相当于当前 WEB 应用的根目录
    若 类定义处标注 @RequestMapping,则方法处标记的 URL 相对于类定义处的@RequestMapping而言的!
    2)映射的 原理:
    DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法。
    3)映射请求参数、请求方法或请求头
    >>@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求
    >>@RequestMapping 的 value、method、params 及 heads 分别表示请求 URL、请求方法、请求参数及请求头的映射条件,
    他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化。
    params 和 headers支持简单的表达式:
    – param1: 表示请求必须包含名为 param1 的请求参数
    – !param1: 表示请求不能包含名为 param1 的请求参数
    – param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1
    –{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1!
    Method:GET / POST /PUT /DELETE
    使用 @RequestMapping 支持Ant风格的请求URL!
    ? Ant 风格资源地址支持 3 种匹配符:
    – ?:匹配文件名中的一个字符
    – *:匹配文件名中的任意多个任意字符[0个字符除外!]
    – **:** 匹配多层路径
    >>@RequestMapping 还支持 Ant 风格的 URL:
    –/user/*/createUser: 匹配
    /user/aaa/createUser、/user/bbb/createUser 等 URL
    –/user/**/createUser: 匹配
    /user/createUser、/user/aaa/bbb/createUser 等 URL
    –/user/createUser??: 匹配
    /user/createUseraa、/user/createUserbb 等 URL
    package com.neuedu.controller;
    
    import javax.websocket.server.PathParam;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    
    
    /* 
    * 项目名称:SpringMVC-demo01 
    * @author:wzc
    * @date 创建时间:2017年8月21日 上午10:38:12
    * @Description:
    * @parameter  
    *   */
    @Controller
    public class AController {
    	private static  final String SUCCESS="success";
    	/*
    	 * 我们通过@Requestmapping做请求的映射
    	 * */
    	@RequestMapping(value="/getParam",method=RequestMethod.POST)
    	public  String getParam(@RequestParam(value="username",required=false,defaultValue="zhangsan") String name,
    @RequestParam(value="pwd",required=false,defaultValue="1234") String pwd){ // service.getOrderById(id) System.out.println("用户名"+name); System.out.println("密码"+pwd); return SUCCESS; } @RequestMapping(value="/order/{id}",method=RequestMethod.GET) public String getorderbyId(@PathVariable(value="id") Integer id){ // service.getOrderById(id) System.out.println("---------"+id); return SUCCESS; } @RequestMapping(value="/order/{id}",method=RequestMethod.POST) public String getorderbyId1(@PathVariable(value="id") Integer id){ // service.getOrderById(id) System.out.println("---------"+id); return SUCCESS; } @RequestMapping(value="/order/{id}",method=RequestMethod.PUT) public String getorderbyId2(@PathVariable(value="id") Integer id){ // service.getOrderById(id) System.out.println("---------"+id); return SUCCESS; } @RequestMapping(value="/order/{id}",method=RequestMethod.DELETE) public String getorderbyId3(@PathVariable(value="id") Integer id){ // service.getOrderById(id) System.out.println("---------"+id); return SUCCESS; } @RequestMapping(value="/sayHello",params={"username","pwd=1234"}) public String sayHello(){ return SUCCESS; } @RequestMapping("/testViewResovler") public String testViewResovler(){ return SUCCESS; } @RequestMapping("/testAnt/{id}") private String testAnt(@PathVariable(value="id") Integer id){ System.out.println(id+"==========="); return SUCCESS; } }  

    @RequestBody

      该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上

    @ResponseBody

       该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区

    @ModelAttribute    

      在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法

      在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中

     @ModelAttribute
    	public void  getStudent(Map<String ,Object> map){
    		Student student=new  Student("李四", "159@163.com", 1);
    		map.put("student", student);
    	}
    	
    	@RequestMapping("/updateStudent")
    	public String  updateStudent(@ModelAttribute(value="student") Student student){
    		String studnetIn = student.toString();
    		System.out.println(studnetIn);
    		return "success";
    	}
    

    @RequestParam 可以接收请求的参数,相当于Servlet的getParameter()方法! 

    注意:要把@RequestParam和@PathVariable区分开:
    三个默认属性:
    value:这个字段要与请求参数的name属性值一致!
    required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
    defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!
    	@RequestMapping(value="/getParam",method=RequestMethod.POST)
    	public  String getParam(@RequestParam(value="username",required=false,defaultValue="zhangsan") String name,
    @RequestParam(value="pwd",required=false,defaultValue="1234") String pwd){ // service.getOrderById(id) System.out.println("用户名"+name); System.out.println("密码"+pwd); return SUCCESS; }
    <form action="${pageContext.request.contextPath}/getParam" method="post">
    		用户名:<input type="text" name="username" >
    	
    		<input type="submit" value="submit">
    	</form>
    

    @PathVariable--映射 URL 绑定的占位符

    带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
    通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
    @PathVariable("xxx") 绑定到操作方法的入参中,需要注意的是:该注解的value属性值要与占位符保持一致。
    @RequestMapping(value="/order/{id}",method=RequestMethod.DELETE)
        public  String getorderbyId3(@PathVariable(value="id") Integer id){
            //  service.getOrderById(id)
            System.out.println("---------"+id);
            return SUCCESS;
        }

    <form action="${pageContext.request.contextPath}/order/4" method="post">
    		<input type="hidden" name="_method" value="delete">
    		<input type="submit" value="submit">
    	</form>
    

    @ExceptionHandler

      注解到方法上,出现异常时会执行该方法
    @ControllerAdvice

      使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常

    @RequestHeader:获取请求头信息,默认属性:
    value:这个字段要与请求参数的name属性值一致!
    required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
    defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!
     
     
    @SessionAttributes注解只能标记在类上,可以使得多次请求共享某部一部分数据!
    value:指定放入session域中键
    types:指定放入Session域中的对象的字节码!
    @SessionAttributes(types={Student.class})
    @Controller
    public class BController {
         @ModelAttribute
    	public void  getStudent(Map<String ,Object> map){
    		Student student=new  Student("李四", "159@163.com", 1);
    		map.put("student", student);
    	}
    	
    	@RequestMapping("/updateStudent")
    	public String  updateStudent(@ModelAttribute(value="student") Student student){
    		String studnetIn = student.toString();
    		System.out.println(studnetIn);
    		return "success";
    	}
    
    }
    

     
     
     
     
     
     
     
     
  • 相关阅读:
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    每日日报
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7414450.html
Copyright © 2020-2023  润新知