美文网首页Java
SpringMVC泛览

SpringMVC泛览

作者: 强某某 | 来源:发表于2019-02-26 13:49 被阅读0次

    SpringMVC

    • 流程图


      图片1.png

    使用步骤

    1. SpringMVC的全局配置文件(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_3_1.xsd"
             version="3.1">
    
        <!-- 配置:所有请求由SpringMVC管理 -->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!-- 代表拦截.do结尾的请求 -->
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    
        <!-- 代表拦截/rest/下的所有路由 -->
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    
        <!-- 配置编码过滤器  -->
        <!-- 解决post请求的中文乱码问题,get的中文乱码问题该tomcat的配置,而且tomcat7及之前的才会乱码,之后的默认UTF8编码 -->
        <filter>
            <filter-name>EncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
    
        <filter-mapping>
            <filter-name>EncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    
    
    1. 基本配置文件 DispatcherServlet-servlet.xml(名称固定,创建在WEB-INF下)
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
    
        <!-- 注解配置控制器-->
        <!-- 1.配置扫描包,告知spring扫描哪些包下的控制器-->
        <context:component-scan base-package="com.zengqiang.backoffice.web.controller"/>
    
        <!-- 2.配置注解处理映射,spring会调用这个处理器,处理器会调用3适配器,然后3处理1中扫描的进行匹配-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        <!-- 3.配置适配器-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
        <!-- 4.配置资源视图解析器,其实就是配置jsp这种视图文件的路径-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/views/"></property>
            <!--后缀-->
            <property name="suffix" value=".jsp"></property>
        </bean>
    </beans>
    
    1. 注解控制器
    @Controller
    // 添加根路径的注解
    @RequestMapping("/user")
    public class UserController{
    
        // 该种方式只能POST方法访问,默认都可以
        //@RequestMapping(value = "list",method = RequestMethod.POST)
        @RequestMapping("list")
        public String list(Model model){
    
            //1.模拟数据库的数据
            List<User> userList = new ArrayList<User>();
            User user1 = new User("习总",60,"男",new Date());
            User user2 = new User("李总",50,"男",new Date());
            User user3 = new User("上官",18,"男",new Date());
    
            user1.setId(1);
            user2.setId(2);
            user3.setId(3);
            userList.add(user1);
            userList.add(user2);
            userList.add(user3);
    
            //2.把数据存在model
            model.addAttribute("userList",userList);
    
            //这种类型的返回,其实就是WEB-INF下面的views文件夹下面的user文件夹下对应的jsp页面
            //而上面的2数据封装到bean,其实就是封装之后给jsp页面使用
            return "user/userlist";
        }
    
        @RequestMapping("/toRegister")
        public String toRegister(){
    
            return "user/register";
        }
    
        /**
         * 第一种接收表单参数的方式:
         * 默认日期格式 月/日/年 10/10/2016
         * @return
         */
        @RequestMapping("/register")
        public String register(String username,String password,
                               int age,String gender,Date birthday,
                               String[] hobbyIds){
    
            System.out.println(username);
            System.out.println(password);
            System.out.println(age);
            System.out.println(gender);
            System.out.println(birthday);
            System.out.println(Arrays.toString(hobbyIds));
            return "user/info";
        }
    
        /**
         * 第二种接收表单参数的方式:
         * 默认日期格式 月/日/年 10/10/2016
         * @return
         */
        @RequestMapping("/register2")
        public String register2(User user){
            System.out.println(user);
            return "user/info";
        }
    
        /**
         * 第三种接收表单参数的方式:
         * @return
         * 相当于模型里有模型
         */
        @RequestMapping("/register3")
        public String register3(UserExt userExt){
            //BindingAwareModelMap m;
            //此时如果User类产生的对象是UserExt对象的一个属性,则在jsp中使用时候,要user.username这种类似的操作
            //否则无法使用
            System.out.println(userExt);
            return "user/info";
        }
    
    
    //接收集合List类型参数
        @RequestMapping("/register4")
        public String register4(UserExt userExt){
            //BindingAwareModelMap m;
            System.out.println(userExt.getUsers());
            // 例如UserExt中user是List形式存在,则在jsp中要userlist[0].username形式使用
            return "user/info";
        }
    
    //接收集合Map类型参数
        @RequestMapping("/register5")
        public String register5(UserExt userExt){
            //BindingAwareModelMap m;
            //例如UserExt中有:Map<String ,Object> infos=new HashMap();
            //在jsp中使用infos['username']
            System.out.println(userExt.getInfos());
            return "user/info";
        }
    
    
        @RequestMapping("/edit")
        public String edit(int id,Model model){
            System.out.println("接收到修改的ID:" + id);
    
            //通过id,查询数据库,返回 一个User对象,把user对象存在model
            User user = new User("习总",60,"男",new Date());//假设从数据查
            user.setId(1);
            model.addAttribute("user",user);
    
            return "user/useredit";
        }
    
    //@PathVariable代表路径的id对应参数的id,注意此时的{id}不是参数,是子路由
        @RequestMapping("/edit1/{id}")
        public String edit1(@PathVariable int id,Model model){
            System.out.println("接收到修改的ID:" + id);
    
            //通过id,查询数据库,返回 一个User对象,把user对象存在model
            User user = new User("习总",60,"男",new Date());//假设从数据查
            user.setId(1);
            model.addAttribute("user",user);
    
            return "user/useredit";
        }
    
        @RequestMapping("test1")
        public String test1(){
            //同一个控制器转发,转发到同一个控制器
            return "forward:list.do";
        }
    
        @RequestMapping("/test1")
        public String test1() {
            //不同控制器转发
            //return "forward:/user/list.do";
            //不同控制器重定向
            return "redirect:/user/list.do";
        }
        /**
        此时RequestParam针对的是真的参数例如  ?30
         * RequestParam参数描述  
         * value:参数名称
         * defaultValue:默认值
         * required:参数是否必须有值,如果为true,参数又为空,会报错,如有默认值则会使用默认值,不报错
         * 
        */
        @RequestMapping("/test2")
        public String test2(@RequestParam(value = "uid",required = true,defaultValue = "30") Integer uid) {
            return "redirect:/user/list.do";
        }
    }
    

    多试图处理

    多视图是一个方法可以返回json/xml等格式的数据

    1. 导入xml格式支持的jar包

    spring-oxm-3.2.0.RELEASE.jar

    1. 配置支持多视图
    <bean
            class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <!-- 配置支持媒体类型 -->
            <property name="contentNegotiationManager">
                <bean
                    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
                    <property name="mediaTypes">
                        <map>
                            <entry key="json" value="application/json"></entry>
                            <entry key="xml" value="application/xml"></entry>
                        </map>
                    </property>
                </bean>
            </property>
    
            <!-- 指定默认视图 -->
            <property name="defaultViews">
                <!-- 支持多个视图 -->
                <list>
                    <!-- 对json格式视图支持 -->
                    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
                    <!-- xml格式视图支持 -->
                    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                        <constructor-arg>
                            <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                                <property name="classesToBeBound">
                                    <list>
                                        <!-- 代表哪些类可以支持转换成json或者xml -->
                                        <value>com.zengqiang.backoffice.domain.Student</value>
                                    </list>
                                </property>
                            </bean>
                        </constructor-arg>
                    </bean>
                </list>
            </property>
        </bean>
    
    1. 例如2中com.zengqiang.backoffice.domain.Student是需要处理的pojo对象,务必要提供无参构造方法
      而且Student如果是提供返回xml还要加上xmlrootelement注解

    ResponseBody和RequestBody


    • @ResponseBody把后台pojo转换json对象,返回到页面。
    • @RequestBody接受前台json数据,把json数据自动封装javaBean

    使用步骤

    1. 导入json的jar


      图2.png
    2. 添加json转换器

    在配置文件DispatcherServlet-servlet.xml的3适配器中


    图3.png
    1. java代码处理
    @RequestMapping("/register")
    //参数中的@ResponseBody将json转换成对象
    //public后面的@ResponseBody是将json对象封装成json返回
    public @ResponseBody Student test2(@ResponseBody Student stu) {
        return stu;
    }
    

    相关文章

      网友评论

        本文标题:SpringMVC泛览

        本文链接:https://www.haomeiwen.com/subject/ybsayqtx.html