欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC配置式开发、注解式开发和控制器参数说明

程序员文章站 2022-04-02 11:17:27
SpirngMVC概述SpringMVC本质就是一个Spring,所以它也可以使用Spring中的Ioc和AOP,与Spring不同的是SpringMVC是专门来做Web应用开发的.除外它还强化了Spring中的注解的使用。配置式开发和Spring一样SpringMVC也有一个核心配置文件用来声明Web相关的对象,例如处理处理器对象,视图对象等项目目录springmvc.xml文件(SpringMVC核心配置文件): ....
  • SpirngMVC概述

SpringMVC本质就是一个Spring,所以它也可以使用Spring中的Ioc和AOP,与Spring不同的是SpringMVC是专门来做Web应用开发的.除外它还强化了Spring中的注解的使用。

  • 配置式开发
    和Spring一样SpringMVC也有一个核心配置文件用来声明Web相关的对象,例如处理处理器对象,视图对象等
  • 项目目录
    SpringMVC配置式开发、注解式开发和控制器参数说明
  • springmvc.xml文件(SpringMVC核心配置文件):
 <!--springmvc的配置文件-->
    <!--声明控制器对象,让容器创建控制器对象,并把请求交给这个对象
    class:控制器类的全限定名
    id:请求的url地址,需要以"/"开头
    -->
    <bean id="/some.do" class="com.bjpowernode.controller.MyController"/>

    <!--声明视图解析器:SpringMVC中的一个对象,处理视图的,能指定视图的路径和扩展名
    InternalResourceViewResolver:内部资源视图解析器,处理jsp等视图文件
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--指定前缀:视图文件目录-->
        <!--注意WEB-INF中的资源文件是受到保护的用户无法直接访问这个目录下的资源-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!--指定后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>
  • web.xml(Tomcat核心配置文件):
<!--
  在服务器启动的时候,会找[/WEB-INF/myweb-servlet.xml]文件
  在DispatcherServlet的init函数中,会创建SpringMVC的容器对象WebApplicationContext,
  在创建容器对象时,会读取SpringMVC需要的配置文件,默认查找为/WEB/<serlvet-name>-servlet.xml

  -->
  <!--注册SpringMVC核心对象DispatcherServlet(*调度器)-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--来指定SpringMVC配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--在服务器启动的时候创建serlvet对象-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--
    <url-pattern>表示把请求交给指定的servlet对象,只有把请求交给DispatcherServlet
    才能使用SpringMVC框架处理.使用DispatcherServlet接受用户的请求在框架中url-pattern

    -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

注意:servlet-mapping中的servlet-name是使用SpringMVC核心对象DIspatchServlet

  • MyController文件:
/**handleRequest()函数可以等同于Servlet中的doService()
     * ModelAndView:表示给用户的处理结果
     * */
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest,
                                      javax.servlet.http.HttpServletResponse httpServletResponse)
            throws Exception {
        ModelAndView mv=new ModelAndView();
        /**数据放到Model中,addObject相当于map.put()
         * Model中的数据最后会放到request作用域中
         * */
        mv.addObject("msg","hello SpringMVC");

        /**指定视图,setViewName("视图的完整路径")
         * 框架对视图执行forward,等同于request.getRequestDispatcher("/show.jsp").forward()
         **/
        //mv.setViewName("/WEB-INF/views/show.jsp");
        /**使用视图解析器后,可以使用视图的逻辑名称(视图文件名)
         * 视图解析器:前缀+逻辑名称+后缀
         * */
        mv.setViewName("show");

        /**返回值只存储了数据和视图的名称
         * */
        return mv;
    }
  • 配置式开发原理
    SpringMVC配置式开发、注解式开发和控制器参数说明

注意的是用户发送的请求以及服务器返回的响应都通过DispatcherServlet,所以DispatcherServlet称为*调度器

  • 注解式开发

注解:1.@Controller:创建控制器对象。2.@RequestMapping:指定请求有哪个函数处理
为了方便理解把原先配置式开发的项目来使用注解开发

  • 对MyController文件的改造:
/**@Controller:创建控制器对象。默认是单例对象
 *控制器对象能接受到用户的请求。指定函数处理请求
 *   位置:在类定义的上面
 * @Controller等同于
 * <bean id="myController" class="com.bjpowernode.controller.MyController"/>
 * */
@Controller
public class MyController{
    /**@RequestMapping:请求映射,指定请求给某一个函数处理
     *      属性:
     *      1.value:请求的url地址,地址是唯一的,推荐"/"开头
     *      2.method:可以指定请求方式(例:method=RequestMethod.POST)
     *      位置:1.在函数的上面. 2.在类的上面(即在类中嵌套使用该注解)
     * */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","SpirngMVC注解式开发");
        /**指定视图名称
         * */
        mv.setViewName("show");
        return mv;
    }
}
  • 对springmvc.xml(SpringMVC核心配置文件)的改造:
<!--声明组件扫描器-->
    <context:component-scan base-package="com.bjpowernode.controller"/>

注意:由于使用了注解开发所以无需在该配置文件中声明控制器对象,只要声明组件扫描器即可

注解式开发原理与配置式开发原理差不多,只不过在SpringMVC核心配置文件查找对应的Controller那里是由组件扫描器来扫描指定包下的@Controller注解和@RequestMapping注解然后通过对应的@RequestMapping注解对应的函数来处理请求,请求的结果同样是存到ModelAndView中并通过DispatcherServlet把数据存到view中然后再通过HttpServletResponse返回到用户浏览器

  • 控制器的参数
@RequestMapping(value = "/some.do")
    public ModelAndView doSome(HttpServletRequest request,
                               HttpServletResponse response,
                               HttpSession session){
        String name=request.getParameter("name");
        String age=request.getParameter("age");
        System.out.println("name:"+name+",age:"+age);
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","SpirngMVC注解式开发");
        /**指定视图名称
         * */
        mv.setViewName("show");
        return mv;
    }

用户提交的参数除了可以使用HttpServletRequest来接收外还可以使用对象和简单类型的参数来接收

  • 简单类型参数接收:
@RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name,int age){
        System.out.println("name:"+name+",age:"+age);
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","SpirngMVC注解式开发");
        /**指定视图名称
         * */
        mv.setViewName("show");
        return mv;
    }

注意:简单类型的参数名称必须与提交请求中的参数名一致,此外该方式来接收用户请求的参数都是String类型的,当用户请求中的age没有值,那么就默认是空字符串或者提交的是字符串,由于后端是int类型的就会报400错误

  • 简单类型接收方式2
 /**@RequestParm注解:
     *   属性:1.value:请求中的参数名
     *   2.required:默认是true,true表示请求中必须有这个参数
     * */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(@RequestParam(value = "rname")String name,
                               @RequestParam(value = "rage") int age){
        System.out.println("name:"+name+",age:"+age);
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","SpirngMVC注解式开发");
        /**指定视图名称
         * */
        mv.setViewName("show");
        return mv;
    }
  • 以对象的方式来接收:
 @RequestMapping(value = "/some.do")
    public ModelAndView doSome(User user){
        System.out.println("控制器接收请求的参数:"+user);
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","SpirngMVC注解式开发");
        /**指定视图名称
         * */
        mv.setViewName("show");
        return mv;
    }

注意:前端的input标签中的name的值要和User类中的set函数省去set后的名一致,这本质就是Spring中的设值注入

本文地址:https://blog.csdn.net/weixin_43730516/article/details/109278722