mvc01

作者: 冷森森 | 来源:发表于2020-12-20 17:13 被阅读0次

    1. MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。

    2. Model:数据模型,JavaBean的类,用来进行数据封装。

    3. View:指JSP、HTML用来展示数据给用户

    4. Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。

    <!-- 版本锁定 -->

    <properties>

    <spring.version>5.0.2.RELEASE</spring.version>

    </properties>

    <dependencies>

    <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>${spring.version}</version>

    </dependency>

    <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-web</artifactId>

    <version>${spring.version}</version>

    </dependency>

    <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-webmvc</artifactId>

    <version>${spring.version}</version>

    </dependency>

    <dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>servlet-api</artifactId>

    <version>2.5</version>

    <scope>provided</scope>

    </dependency>

    <dependency>

    <groupId>javax.servlet.jsp</groupId>

    <artifactId>jsp-api</artifactId>

    <version>2.0</version>

    <scope>provided</scope>

    </dependency>

    </dependencies>

    配置核心的控制器(配置DispatcherServlet)

     在web.xml配置文件中核心控制器DispatcherServlet

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"

            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

            id="WebApp_ID" version="3.0">

        <!-- SpringMVC的核心控制器 -->

        <servlet>

            <servlet-name>dispatcherServlet</servlet-name>

            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

            <!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->

            <init-param>

                <param-name>contextConfigLocation</param-name>

                <param-value>classpath:springmvc.xml</param-value>

            </init-param>

            <!-- 配置servlet启动时加载对象 -->

            <load-on-startup>1</load-on-startup>

        </servlet>

        <servlet-mapping>

            <servlet-name>dispatcherServlet</servlet-name>

            <url-pattern>/</url-pattern>

        </servlet-mapping>

    </web-app>

    springmvc.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">

        <!-- 配置spring创建容器时要扫描的包 -->

        <context:component-scan base-package="com.xxx"></context:component-scan>

        <!-- 配置spring开启注解mvc的支持-->

        <mvc:annotation-driven></mvc:annotation-driven>

        <!-- 配置视图解析器 -->

        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

            <property name="prefix" value="/WEB-INF/pages/"></property>

            <property name="suffix" value=".jsp"></property>

        </bean>

    </beans>

    /**

    * params参数:

    *      "name":表示请求必须包含name参数

    *      "!age":表示请求不能包含age参数

    *      "address!=usa":表示请求中address参数的值不能为usa

    *      "working=sz":表示请求参数中的working参数必须为sz

    * @return

    */

    @RequestMapping(params = {"name","!age","address!=usa","working=sz"},

                        value = "/say",method = RequestMethod.GET)

    public String sayHello() {

        System.out.println("Hello SpringMVC!!调用了GET方法");

        return "success";

    /**

    * headers参数:

    *      "Accept":表示请求头必须包含Accept头信息

    *      "!Date":表示请求头中不能包含Date的头信息

    *      "Accept-Encoding!=zh-CN":表示请求头中Accept-Encoding头信息的值不能为zh-CN

    *      "Host=localhost:18081":表示请求头中Host的值必须为localhost:18081

    *

    * @return

    */

    @RequestMapping(headers = {"Accept","!Date","Accept-Encoding!=zh-CN","Host=localhost:18081"},

                    value = "/say",method = RequestMethod.GET)

    public String sayHello() {

        System.out.println("Hello SpringMVC!!调用了GET方法");

        return "success";

    @Controller

      @RequestMapping(value = "/user")

      public class UserController {

          /***

          * 接收Map

          * @return

          */

          @RequestMapping(value = "/add")

    接受map 数据   public String addUser(@RequestParam Map userMap){

              System.out.println(userMap);

              return "success";

          }

      }

    @Controller

      @RequestMapping(value = "/user")

      public class UserController {

          /***

          * 接收List

          *      注意:接收List,需要在方法中加入注解@RequestParam

          *            一会儿页面传过来的表单参数名字也要和方法名字id一致

          *            例如:

          *                  ID1:<input name="id">

          *                  ID2:<input name="id">

          *                  ID3:<input name="id">

          * @return

          */

          @RequestMapping(value = "/add")

          public String addUser(@RequestParam List<Integer> id){

              System.out.println(id);

              return "success";

          }

      }

    请求参数POST请求中文乱码的解决

    <!-- 配置过滤器,解决中文乱码的问题 -->

    <filter>

    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

    自定义类型转换器

    Date类型并不能实现转换,需要我们手动解决

    自定义类型转换器

    package com.xxx.util;

    import org.springframework.core.convert.converter.Converter;

    import java.text.ParseException;

    import java.text.SimpleDateFormat;

    import java.util.Date;

    public class DateConverter implements Converter<String,Date>{

        /***

        * 将String类型转成Date类型

        * @param str

        * @return

        */

        public Date convert(String str) {

            try {

                //定义一个时间转换工具对象

                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

                //将字符串转Date并返回

                return simpleDateFormat.parse(str);

            } catch (ParseException e) {

                throw new RuntimeException(e);

            }

        }

    }

    注册自定义类型转换器,在springmvc.xml配置文件中编写配置

    <!-- 配置spring开启注解mvc的支持-->

    <mvc:annotation-driven conversion-service="conversionService" />

    <!--

        注册自定义类型转换器

    -->

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

        <property name="converters">

            <bean class="com.xxx.util.DateConverter" />

        </property>

    </bean>

    在控制器中使用原生的ServletAPI对象

    只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象

    RequestParam注解

    作用:把请求中的指定名称的参数传递给控制器中的形参赋值属性value:请求参数中的名称required:请求参数中是否必须提供此参数,默认值是true,必须提供

    /**

    * 接收请求

    * @return

    */

    @RequestMapping(path="/hello")

    public String sayHello(@RequestParam(value="username",required=false)String name) {

    System.out.println("aaaa");

    System.out.println(name);

    return "success";

    }

     RequestBody注解

    作用:用于获取请求体的内容(注意:get方法不可以)属性required:是否必须有请求体,默认值是true

    代码如下

    /**

    * 接收请求

    * @return

    */

    @RequestMapping(path="/hello")

    public String sayHello(@RequestBody String body) {

    System.out.println("aaaa");

    System.out.println(body);

    return "success";

    }

    PathVariable注解

    作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符属性value:指定url中的占位符名称

    /**

    * 接收请求

    * @return

    */

    @RequestMapping(path="/hello/{id}")

    public String sayHello(@PathVariable(value="id") String id) {

    System.out.println(id);

    return "success";

    }

     RequestHeader注解

    作用:获取指定请求头的值

    属性

    value:请求头的名称

      代码如下

      @RequestMapping(path="/hello")

      public String sayHello(@RequestHeader(value="Accept") String header) {

      System.out.println(header);

      return "success";

      }

    CookieValue注解

    作用:用于获取指定cookie的名称的值

    属性

      value:cookie的名称

    代码

    @RequestMapping(path="/hello")

    public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) {

    System.out.println(cookieValue);

    return "success";

    }

     ModelAttribute注解

    作用

        出现在方法上:表示当前方法会在控制器方法执行前线执行

        出现在参数上:获取指定的数据给参数赋值

          应用场景

          当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。

    具体的代码

    在上面的案例基础之上,给User中添加一个sex属性,再到UserController中添加一个parameterUser()方法,并创建User再赋值返回,方法上加上注解@ModelAttribute注解。

    @Controller

    @RequestMapping(value = "/user")

    public class UserController {

        /***

        * 优先执行

        * @return

        */

        @ModelAttribute

        public User parameterUser(){

            User user = new User();

            user.setSex("男");

            return user;

        }

        /***

        * 此时的user已经被上面的parameterUser先执行了修改,已经给sex赋值

        */

        @RequestMapping(value = "/add")

        public String addUser(User user){

            System.out.println("用户" + user.getName() +",性别:"+user.getSex()+","+ "今年" + user.getAge() + "岁,住在" + user.getIdCard().getAddress() + ",身份证号是" + user.getIdCard().getNumber());

            for (Mobile mobile : user.getMobiles()) {

                System.out.println(mobile.getMobileName()+"花了"+mobile.getPrice());

            }

            return "success";

        }

    }

    SpringMVC会把Model(模型信息)中的的数据放入到request域对象中,页面可以通过EL表达式来取request域中的数据。我们可以先写一个案例,在后台使用Model的addAttribute方法,页面使用EL表达式取数据。

    创建 ModelController

    @Controller

    @RequestMapping(value = "/model")

    public class ModelController {

        /***

        * Model的使用

        * @param model

        * @return

        */

        @RequestMapping(value = "/add")

        public String add(Model model){

            model.addAttribute("msg","张三");

            return "success";

        }

    }

    success.jsp页面从request域中取数据

    ${msg}

    ${requestScope}

    SessionAttributes注解

    作用:用于多次执行控制器方法间的参数共享

    属性

    value:指定存入属性的名称

    @Controller

    @RequestMapping(path="/user")

    @SessionAttributes(value= {"username","password","age"},types= {String.class,Integer.class}) // 把数据存入到session域对象中

    public class HelloController {

    /**

    * 向session中存入值

    * @return

    */

    @RequestMapping(path="/save")

    public String save(Model model) {

    System.out.println("向session域中保存数据");

    model.addAttribute("username", "root");

    model.addAttribute("password", "123");

    model.addAttribute("age", 20);

    return "success";

    }

    /**

    * 从session中获取值

    * @return

    */

    @RequestMapping(path="/find")

    public String find(ModelMap modelMap) {

    String username = (String) modelMap.get("username");

    String password = (String) modelMap.get("password");

    Integer age = (Integer) modelMap.get("age");

    System.out.println(username + " : "+password +" : "+age);

    return "success";

    }

    /**

    * 清除值

    * @return

    */

    @RequestMapping(path="/delete")

    public String delete(SessionStatus status) {

    status.setComplete();

    return "success";

    }

    }

    相关文章

      网友评论

          本文标题:mvc01

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