SpringMVC
SpringMVC学习笔记(一)
一、SpringMVC基础入门,创建一个HelloWorld程序
1.首先,导入SpringMVC需要的jar包。
<!-- 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配置文件
<!-- 配置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"; }
}
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
1). 在控制器的类定义及方法定义处都可标注
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()方法!
@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 绑定的占位符
@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发生的异常
@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"; } }