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";
	}

}

 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/Actexpler-S/p/7414450.html