Springday04(SpringMVC)
MVC设计模式回顾
MVC优点及缺点
Spring环境搭建
引入依赖
spring-web spring-webmvc
<!--Spring MVC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.9.RELEASE</version> </dependency>
由于是一个Web工程,需要Servlet-API支持
<!--Servlet API--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
能够运行的tomcat的插件
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!--配置端口号--> <port>8080</port> <!--配置上下文路径--> <path>/</path> <!--配置编码格式--> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build>
作为web工程,需要将打包形式,更改为war
<packaging>war</packaging>
将工程转为web工程
将普通的Maven工程转换为web工程。在工程中,添加webapp以及对应的web.xml文件
添加配置文件
Spring MVC默认的配置文件名为:XXX-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--扫描controller包--> <context:component-scan base-package="com.csi.controller" /> <!--开启注解支持--> <mvc:annotation-driven /> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <constructor-arg name="prefix" value="/" /> <constructor-arg name="suffix" value=".jsp" /> </bean> </beans>
在web.xml文件下添加DispatcherServlet的映射
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--配置Spring MVC核心配置文件--> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-dispatcher.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
创建Controller
在工程中,创建一个controller类,在Controller之上,添加@Controller,为了能够映射到对应的方法进行处理,所有在方法上增加@RequestMapping("地址")注解。最后返回的结果是一个页面名称。
@Controller public class IndexController { @RequestMapping("/save") public String save() { System.out.println("save。。。"); return "index" ; } @RequestMapping("/index") public String index(Model model) { model.addAttribute("hello","hello,SpringMVC!") ; //返回页面名称 return "index" ; } }
Spring MVC处理流程
- 用户发起请求,此时web容器对请求的url地址进行匹配,如果匹配到,就会启动DispatcherServlet。
- DispatcherServlet会加载核心配置文件,并将其中的所有bean解析。
- DispatcherServlet会根据用户请求的路径来匹配bean中的name值,如果匹配到,则会调用对应的类,否则404.
- 之后DIspatcherServlet会调用对应的类,执行类中的方法,并且调用HttpMessageConveter完成数据的转化、格式化、验证等工作,在完成一系列工作后,会返回一个ModelAndView对象。在ModelAndView对象中,包含有内容Model和视图View,
- DispatcherServlet将ModelAndView交给InternalResourceViewResolver处理。主要是将前缀+视图名称+后缀拼接,返回给DispatcherServlet。
- DispatcherServlet将Model交给View,此时View会进行渲染。
- 将渲染的结果返回给用户。
Spring MVC参数处理
使用Servlet API
@RequestMapping("/save") public String save(HttpServletRequest request, HttpSession session) { //直接操作ServletAPI String username = request.getParameter("username"); System.out.println(username); session.setAttribute("username",username); request.setAttribute("username",username); return "index" ; }
使用RequestParam注解传参
RequestParam注解源码
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { //参数名称 @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; //是否在请求时必须带有对应的参数,默认值是true boolean required() default true; //如果没有找到对应的值,则以default值填充 String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n"; }
示例
@RequestMapping(value={"/delete","/deleteById"},method = RequestMethod.GET) public String deleteById(@RequestParam(value="userid",defaultValue = "0") int userId) { System.out.println("==============" + header); return "index" ; }
使用RequestMapping设置
@RequestMapping( value={"/delete","/deleteById"}, //多个url路径映射到同一个方法上 method = RequestMethod.GET, //设置当前方法的请求方式 params = "userId" // 设置获取的参数 )
@RequestMapping(value={"/delete","/deleteById"},method = RequestMethod.GET,params = "userId") public String deleteById(@RequestHeader("Cookie") String header) { System.out.println("==============" + header); return "index" ; }
以对象传参
使用对象当作参数传输,那么SpringMVC会将传输的参数,按照对象的setter方法进行赋值
@RequestMapping(value = "/update",method = RequestMethod.GET) public String update(UserInfo userInfo) { System.out.println(userInfo.getUserName()); System.out.println(userInfo); }
以其形式传输
-
-
List/Set
@RequestMapping(value = "/update",method = RequestMethod.GET) public String update(@RequestParam Map<String,Object> map) {
可以将提交的数据,以参数key作为map的key,以参数的值作为map的value进行存储。