zoukankan      html  css  js  c++  java
  • 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处理流程

    1. 用户发起请求,此时web容器对请求的url地址进行匹配,如果匹配到,就会启动DispatcherServlet。
    2. DispatcherServlet会加载核心配置文件,并将其中的所有bean解析。
    3. DispatcherServlet会根据用户请求的路径来匹配bean中的name值,如果匹配到,则会调用对应的类,否则404.
    4. 之后DIspatcherServlet会调用对应的类,执行类中的方法,并且调用HttpMessageConveter完成数据的转化、格式化、验证等工作,在完成一系列工作后,会返回一个ModelAndView对象。在ModelAndView对象中,包含有内容Model和视图View, 
    5. DispatcherServlet将ModelAndView交给InternalResourceViewResolver处理。主要是将前缀+视图名称+后缀拼接,返回给DispatcherServlet。
    6. DispatcherServlet将Model交给View,此时View会进行渲染。
    7. 将渲染的结果返回给用户。

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

     示例

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

    以其形式传输

    • Map

    • List/Set

    @RequestMapping(value = "/update",method = RequestMethod.GET)
    public String update(@RequestParam Map<String,Object> map) {

    可以将提交的数据,以参数key作为map的key,以参数的值作为map的value进行存储。

  • 相关阅读:
    Fastify 系列教程四 (求对象、响应对象和插件)
    Fastify 系列教程三 (验证、序列化和生命周期)
    Fastify 系列教程二 (中间件、钩子函数和装饰器)
    Fastify 系列教程一 (路由和日志)
    使用 Vuejs 开发 chrome 插件的注意事项
    五十行javascript代码实现简单的双向数据绑定
    markown编辑器截图粘贴预览,并将图片传至七牛云
    线程与进程的区别
    TeamViewer卡在正在初始化显示参数
    Chrome 字体模糊解决
  • 原文地址:https://www.cnblogs.com/heureuxl/p/13893275.html
Copyright © 2011-2022 走看看