SpringMVC知识点 总结

SpringMVC简介:

SpringMVC是一个基于模型(M)-视图(V)-控制器(C)的的Web框架。

MVC模式使应用程序的不同方面(输入逻辑,业务逻辑 和 UI逻辑)分离,同时提供这些元素之间的松耦合。

  • 模型(Model)封装了应用程序数据,通常它们将由POJO类组成。
  • 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
  • 控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。

SpringMVC过程:

Spring Web模型 - 视图 - 控制器(MVC)框架是围绕DispatcherServlet设计的,它处理所有的HTTP请求和响应。

中央前端控制器(是一个servlet -- DispatcherServlet):它负责每个请求到合适的处理程序。

  • 在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。
  • Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
  • DispatcherServlet将从ViewResolver获取请求的定义视图。
  • 当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。

组件:

1、中央前端控制器DispatcherServlet(不需要程序员开发) 作用:接收请求,相应结果。相当于转发器,中央处理器。 2、处理器映射器HandlerMapping(不需要程序员开发) 作用:根据请求的url查找Controller(也可称为Handler) 3、处理器适配器HandlerAdapter(不需要程序员开发) 作用:按照特定规则(HandlerAdapter要求的规则)去执行Controller 注意:编写Controller时按照HandlerAdapter的要求做,这样适配器才可以正确执行Controller 4、处理器Controller(需要程序员开发) 作用:实现具体的业务逻辑 5、视图解析器ViewResolver(不需要程序员开发) 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view) 6、视图View(需要程序员开发) View是一个接口,实现类支持不同的view类型。

图解应用程序流程:

图片来源:https://www.yiibai.com/spring_mvc/spring-mvc-tutorial-for-beginners.html

HttpServletRequest & HttpServletResponse

在Controller中可以使用 HttpServletRequest, HttpServletResponse来获取http请求和返回http响应。

@Controller
public class HelloWorldController {

   @RequestMapping("/hello")
   public String requestResponseExample(HttpServletRequest request,
           HttpServletResponse reponses, Model model) {
 
       // Todo something here

       return "helloworld";
   }
}

重定向

使用前缀 "redirect:" ,该方法返回字符串,可以重定向到另一页面。

@Controller
public class RedirectController {
 
    @RequestMapping(value = "/redirect", method = RequestMethod.GET)
    public String authorInfo(Model model) {
 
       // Do somethong here
 
        return "redirect:/redirect_newpage";
    }
}

注解

@Controller注解

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。

@RequestMapping注解

@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestParam注解

@RequestParam 注解将请求参数绑定到控制器方法参数。

@Controller
public class RequestParamController {
     
    @RequestMapping("/user")
    public String userInfo(Model model,
            @RequestParam(value = "name", defaultValue = "Guest") String name) {
        if("admin".equals(name)) {
            model.addAttribute("email", "admin@yiibai.com");
        } else{
            model.addAttribute("email", "Not set");
        }
        return "userInfo";
    }
}

userInfo.jsp如下:

<html>
<body>
   <h2>${name}</h2>
   Email: ${email}
</body>
</html>

现在在浏览器地址栏输入:http://localhost:8080/HelloSpringMVC/user?name=admin

页面显示:email: admin@yiibai.com

@PathVariable注解

@PathVariable注释将一个方法参数绑定到一个URI模板变量的值。

@RequestMapping("/web/fe/{sitePrefix}/{language}/document/{id}/{naturalText}")
    public String documentView(Model model,
        @PathVariable(value = "sitePrefix") String sitePrefix,
        @PathVariable(value = "language") String language,
        @PathVariable(value = "id") Long id,
        @PathVariable(value = "naturalText") String naturalText) {
 
            model.addAttribute("sitePrefix", sitePrefix);
            model.addAttribute("language", language);
            model.addAttribute("id", id);
            model.addAttribute("naturalText", naturalText);
        }
    return "documentView";
}

@ResponseBody注解

如果使用 @ResponseBody 注释到方法, spring 将尝试转换它的返回值,并自动写入到HTTP响应。在这种情况下,并不需要一个特定的视图。

注:返回值不一定是字符串类型。

@Controller
public class ResponseBodyExample1Controller {
    // Simple example, method returns String.
    @RequestMapping(value = "/saveResult")
    @ResponseBody
    publicString authorInfo(Model model) {
        return "saved";
    }
}

@requestBody注解

@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容。一般情况下来说常用其来处理application/json类型。

例如页面发送来一个ajax请求:

$.ajax({
    url:"/login",
    type:"POST",
    data:'{"userName":"admin","pwd","admin123"}',
    content-type:"application/json charset=utf-8",
    success:function(data){
        alert("request success ! ");
    }
});

后台接收数据可以采用@requestBody注解:

@requestMapping("/login")
public void login(@requestBody String userName,@requestBody String pwd){
    System.out.println(userName+" :"+pwd);
}

如果我有一个User类,拥有如下字段:

  • String userName;
  • String pwd;

那么上述参数可以改为以下形式:@requestBody User user 。需要注意的是,JSON字符串中的key必须对应user中的属性名。

处理映射

控制器类名称处理映射

类ControllerClassNameHandlerMapping是基于约定的处理程序映射类,它将URL请求映射到配置中提到的控制器的名称。这个类接收控制器名称并将其转换为带有前导“/”的小写形式。 例如HelloController映射到URL: ”/hello*”。

<beans>
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"/>
   </bean>

   <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

   <bean class="com.yiibai.springmvc.HelloController" />

   <bean class="com.yiibai.springmvc.WelcomeController"/>   
</beans>

使用上面的配置,URI:

  • 对于/helloWorld.html或 /hello{任何字母}.htmlDispatcherServlet将请求转发到HelloController类。
  • 对于/welcome.htmlDispatcherServlet会将请求转发给WelcomeController类。
  • 对于/welcome1.htmlDispatcherServlet将不会找到任何控制器,服务器将抛出404状态错误。

简单URL处理映射

SimpleUrlHandlerMapping类分别显式地将URL映射到相应的控制器上。

<beans>

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"/>
   </bean>

   <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
      <property name="mappings">
         <props>
            <prop key="/welcome.html">welcomeController</prop>           
            <prop key="/helloWorld.html">helloController</prop>
         </props>
      </property>
   </bean>

   <bean id="helloController" class="com.yiibai.springmvc.HelloController" />

   <bean id="welcomeController" class="com.yiibai.springmvc.WelcomeController"/>  
</beans>

使用上面的配置,如果URI:

  • 对于/helloWorld.html请求,DispatcherServlet将请求转发到HelloController类。
  • 对于/welcome.htmlDispatcherServlet会将请求转发给WelcomeController类。

控制器

MultiActionController类用于在单个控制器中分别映射多个URL到对应的方法。

public class UserController extends MultiActionController{

   public ModelAndView home(HttpServletRequest request,
      HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("home");
      model.addObject("message", "Home");
      return model;
   }

   public ModelAndView add(HttpServletRequest request,
      HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Add");
      return model;
   }

   public ModelAndView remove(HttpServletRequest request,
      HttpServletResponse response) throws Exception {
      ModelAndView model = new ModelAndView("user");
      model.addObject("message", "Remove");
      return model;
   }
}

多动作控制器

URL映射配置文件如下:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean name="/home.html" class="com.yiibai.springmvc.UserController" /> 
<bean name="/user/*.html" class="com.yiibai.springmvc.UserController" />

使用上面的配置,如果URI:

  • 对于/home.html请求,DispatcherServlet将请求转发到UserController类的 home()方法。
  • 对于user/add.htmlDispatcherServlet将请求转发到UserController类的 add()方法。
  • 对于user/remove.htmlDispatcherServlet将请求转发到UserController类的 remove()方法。

属性方法名称解析器

URL映射配置文件如下:

<bean class="com.yiibai.springmvc.UserController">
   <property name="methodNameResolver">
      <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
         <property name="mappings">
            <props>
               <prop key="/user/home.html">home</prop>
               <prop key="/user/add.html">add</prop>
               <prop key="/user/update.html">update</prop>      
            </props>
         </property>
      </bean>
   </property>
</bean>

使用上面的配置,如果URI:

  • 对于/user/home.html请求,DispatcherServlet将请求转发到UserController类的 home()方法。
  • 对于user/add.htmlDispatcherServlet将请求转发到UserController类的 add()方法。
  • 对于user/remove.htmlDispatcherServlet将请求转发到UserController类的 remove()方法。

参数方法名称解析器

URL映射配置文件如下:

<bean class="com.yiibai.springmvc.UserController">
   <property name="methodNameResolver">
      <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
         <property name="paramName" value="action"/>
      </bean>
   </property>
</bean>

使用上面的配置,如果URI:

  • 对于/user/*.html?action=home请求,DispatcherServlet将请求转发到UserController类的 home()方法。
  • 对于/user/*.html?action=addDispatcherServlet将请求转发到UserController类的 add()方法。
  • 对于/user/*.html?action=removeDispatcherServlet将请求转发到UserController类的 remove()方法。

可参数化的视图控制器

URL映射配置文件如下:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
      <value>
         index.html=userController
      </value>
   </property>
</bean>
<bean id="userController" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
   <property name="viewName" value="index"/>
</bean>

使用上面的配置,如果URI:

  • 对于/index.html请求,DispatcherServlet会将请求转发到UserController控制器,并将viewName设置为index.jsp

视图解析器

内部资源视图解析器

InternalResourceViewResolver用于将提供的URI解析为实际URI。

@Controller
@RequestMapping("/hello")
public class HelloController{

   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Spring MVC Framework 映射网页与请求示例!");
      return "hello";
   }
}

URL映射配置文件如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="prefix" value="/WEB-INF/jsp/"/>
   <property name="suffix" value=".jsp"/>
</bean>

使用上面的配置,如果URI

  • 对于/hello请求,DispatcherServlet会将请求转发到prefix+ view-name + suffix = /WEB-INF/jsp/hello.jsp

XML视图解析器

XmlViewResolver用于在xml文件中定义的视图bean来解析视图名称。

XmlViewResolver-servlet.xml 配置如下所示 -

<bean class="org.springframework.web.servlet.view.XmlViewResolver">
   <property name="location">
      <value>/WEB-INF/views.xml</value>
   </property>
</bean>

views.xml 配置如下所示 -

<bean id="hello"
   class="org.springframework.web.servlet.view.JstlView">
   <property name="url" value="/WEB-INF/jsp/hello.jsp" />
</bean>

例如,使用上面的配置,如果URI

  • 对于/hello请求,DispatcherServlet会将请求转发到由view.xml中定义的hello对应的 hello.jsp 。

资源绑定视图解析器

ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称。

ResourceBundleViewResolver-servlet.xml 配置如下所示 -

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
   <property name="basename" value="views" />
</bean>

这里basename是指携带视图的资源束的名称。资源束的默认名称是views.properties,可以使用basename属性重写(也就是将views修改为其它名称,对应的views.properties文件名称也要修改)。

views.properties 配置如下所示 -

hello.(class)=org.springframework.web.servlet.view.JstlView
hello.url=/WEB-INF/jsp/hello.jsp

例如,使用上面的配置,如果URI

  • 对于/hello请求,DispatcherServlet会将请求转发到由views.properties中定义的hello对应的 hello.jsp 。
  • 这里“hello”是要匹配的视图名称。class指定视图类型,url是视图的位置。

多解析器映射

MultipleResolver-servlet.xml 配置如下所示 -

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
   <property name="basename" value="views" />
   <property name="order" value="0" />
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="prefix" value="/WEB-INF/jsp/" />
   <property name="suffix" value=".jsp" />
   <property name="order" value="1" />
</bean>

这里order属性定义了视图解析器的排序。0作为第一解析器,1作为下一解析器,等等。

views.properties 配置如下所示 -

hello.(class)=org.springframework.web.servlet.view.JstlView
hello.url=/WEB-INF/jsp/hello.jsp

例如,使用上面的配置,如果URI

  • 对于/hello请求,DispatcherServlet会将请求转发到由views.properties中定义的hello对应的 hello.jsp 。
  • 这里“hello”是要匹配的视图名称。class指定视图类型,url是视图的位置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券