SpringMVC知识点 总结

1、图解应用程序流程:

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

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

3、重定向

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

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

4、注解

4.1、@Controller注解

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

4.2、 @RequestMapping注解

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

4.3、@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

4.4、@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";
}

4.5、@ResponseBody注解

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

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

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

4.6、 @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中的属性名。

5、处理映射

5.1、 控制器类名称处理映射

类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状态错误。

5.2、 简单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类。

6、控制器

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

6.1、多动作控制器

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()方法。

6.2、属性方法名称解析器

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()方法。

6.3、参数方法名称解析器

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()方法。

6.4、可参数化的视图控制器

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

7、视图解析器

7.1、内部资源视图解析器

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

7.2、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 。

7.3、资源绑定视图解析器

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是视图的位置。

7.4、多解析器映射

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值