SpringMVC——基础


依赖

 <dependencies>
     <dependency>
         <groupId>junitgroupId>
         <artifactId>junitartifactId>
         <version>4.12version>
         <scope>testscope>
     dependency>
     <dependency>
         <groupId>org.springframeworkgroupId>
         <artifactId>spring-webmvcartifactId>
         <version>5.2.8.RELEASEversion>
     dependency>
     <dependency>
         <groupId>javax.servletgroupId>
         <artifactId>servlet-apiartifactId>
         <version>2.5version>
     dependency>
     <dependency>
         <groupId>javax.servlet.jspgroupId>
         <artifactId>jsp-apiartifactId>
         <version>2.2version>
     dependency>
     <dependency>
         <groupId>javax.servletgroupId>
         <artifactId>jstlartifactId>
         <version>1.2version>
     dependency>
 dependencies>

如果创建项目时没有选择web模板而是手动添加的,可能会遇到404的问题:

检查项目发布中有没有lib依赖,没有的话要手动建lib包并且把jar包都丢进去

 

1.执行原理

1.配置web.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
 ?
   
   <servlet>
     <servlet-name>springmvcservlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
     
     <init-param>
       <param-name>contextConfigLocationparam-name>
       <param-value>classpath:springmvc-servlet.xmlparam-value>
     init-param>
     
     <load-on-startup>1load-on-startup>
   servlet>
   
   <servlet-mapping>
     <servlet-name>springmvcservlet-name>
     <url-pattern>/url-pattern>
   servlet-mapping>
 ?
 web-app>

 

2.新建springmvc的配置文件

对应classpath:springmvc-servlet.xml中的值

 <?xml version="1.0" encoding="GBK"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd">
 ?
     
     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
     
     <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
 ?
     
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
         
         <property name="prefix" value="/WEB-INF/jsp/"/>
         <property name="suffix" value=".jsp"/>
     bean>
 ?
     <bean id="/hello" class="com.yl.controller.HelloController"/>
 beans>

建立controller类

 package com.yl.controller;
 ?
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.Controller;
 ?
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 ?
 public class HelloController implements Controller {
     @Override
     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
         ModelAndView mv = new ModelAndView();
         //业务代码
         String result = "HelloSpringMVC";
         mv.addObject("msg",result);
         //视图跳转
         mv.setViewName("test");//再视图解析器中拼接前后缀
         return mv;
    }
 }

对应的前端页面就是WEB-INF/jsp/test.jsp

执行原理:

用户输入hello请求-》

 

3.使用注解开发

1.配置web.xml(固定)

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
 ?
     
     <servlet>
         <servlet-name>springmvcservlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
         
         <init-param>
             <param-name>contextConfigLocationparam-name>
             <param-value>classpath:springmvc-servlet.xmlparam-value>
         init-param>
         
         <load-on-startup>1load-on-startup>
     servlet>
     
     <servlet-mapping>
         <servlet-name>springmvcservlet-name>
         <url-pattern>/url-pattern>
     servlet-mapping>
 ?
 web-app>

2.springmvc-servlet.xml

 <?xml version="1.0" encoding="GBK"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/mvc
         https://www.springframework.org/schema/mvc/spring-mvc.xsd">
 ?
     
     <context:component-scan base-package="com.yl.controller"/>
     
     <mvc:default-servlet-handler/>
     
     <mvc:annotation-driven/>
 ?
     
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
         
         <property name="prefix" value="/WEB-INF/jsp/"/>
         <property name="suffix" value=".jsp"/>
     bean>
 ?
 beans>

3.controller

 package com.yl.controller;
 ?
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 ?
 @Controller
 public class HelloController {
 ?
     @RequestMapping("/h1")
     public String hello(Model model){
         //封装数据
         model.addAttribute("msg","Hello,SpringMVCAnnotation");
         return "hello";//返回的就是视图的名字,会被视图解析器处理
    }
 }

 

4.RequestMapping

可以放在类和方法上

 @RequestMapping("/hc1")
 public class HelloController {
 ?
     @RequestMapping("/h1")
     public String hello(Model model){}//此时访问路径是/hc1/h1
 }

 

5.RestFul风格

 @RequestMapping(value = "/hello/{a}/{b}",method = RequestMethod.GET)
 public String hello(@PathVariable int a,@PathVariable int b, Model model){
     int result = a + b;
     //封装数据
     model.addAttribute("msg","结果为" + result);
     return "hello";//返回的就是视图的名字,会被视图解析器处理
 }

原来的访问地址:/hello?a=1&b=2

此时访问的地址:/hello/1/2

 

6.重定向和转发

 //转发
 //return "test";
 return "forward:hello";
 //return "forward:/WEB-INF/jsp/hello.jsp";
 //重定向
 //return "redirect:/index.jsp";
 //return "redirect:hello";

以上方式都可以

 

7.接收请求参数

 @GetMapping("/t1")
 public String test(@RequestParam("username") String name, Model model){
     System.out.println("name="+name);
     model.addAttribute("msg",name);
     return "test";
 }

@RequestParam()限制了前端传参的名字,此时只能通过username传值,name失效。

 /*
     1.接收前端用户传递的参数,假设名字直接再方法上,可以直接使用
     2.假设传的是一个对象,匹配对象中的字段名,符合则成功匹配,否则不匹配的字段返回null
     */
 @GetMapping("/t2")
 public String test2(User user, Model model){
     model.addAttribute("msg",user.toString());
     return "test";
 }