• SpringMVC框架学习01


    写在前面

    在SSM框架中,每一层架构都有对应的框架。在学习了持久层的mybatis和贯穿始终也可以说是业务层的spring框架后,只剩下表现层的springMVC框架了。今天粗略入了个门,稍作记录。

    三层架构

    在我们的web开发中,我们一般都遵循着三层架构:web层,service层,dao层.在初学java web的时候我并不知道这些东西有什么用处。毕竟对于初学者来说多一个service层根本是麻烦。但在经过最近的练习后,我对三层架构有了更深一点的理解。由于我自己没有做过复杂的项目,并不知道service层的真正意义。在看了github上一些毕设级别的项目后,有了大概的认知。web层仅仅是作为一个媒介来传递通知,dao层只做对数据库底层的操作,service来对数据进行加工处理。在我自己的APP项目中API的编写我也用了这种方式,即让各层解耦,降低整个项目的耦合性。这样日后翻看和修改项目逻辑会更加清晰。

    SpringMVC框架入门程序

    使用idea的maven项目导入了web的模版后,添加对应的依赖:

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <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>
    
    

    之后就可以开始编写一个简单的SpringMVC入门程序了.
    首先我们要在web.xml里配置好对应的内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <display-name>Archetype Created Web Application</display-name>
      <!-- 前端控制器-->
      <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
      <!-- 解决中文乱码的过滤器-->
      <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>
    </web-app>
    

    之后我们在页面写一个a标签用来跳转,然后写一个对应的Controller类:

    @Controller
    @RequestMapping(path = "/user")
    public class HelloController {
        @RequestMapping(path="/hello")
        public String sayHello(){
            System.out.println("hello StringMVC");
            return "success";
        }
    

    需要注意的是,这里的return "success"需要在spring的配置文件中配置:

    <?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">
        <!-- 开启注解扫描-->
        <context:component-scan base-package="com.liuge"></context:component-scan>
        <!-- 配置视图解析器-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 配置自定义类型转换器-->
        <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="com.liuge.utils.StringToDateConverter"></bean>
                </set>
            </property>
        </bean>
        <!--开启SpringMVC框架注解的支持 -->
        <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
    </beans>
    

    之后运行我们就可以看到效果了.

    SpringMVC的处理流程

    使用并不是很难。我们来看一下具体的运行流程:

    可以看到,这张图上前端控制器作为核心部件,承担着传递请求的作用。具体的逻辑大家可以看上图。

    RequestMapping的解释

    1. RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
    2. RequestMapping注解可以作用在方法和类上
      2.1. 作用在类上:第一级的访问目录
      2.2. 作用在方法上:第二级的访问目录
      2.3. 细节:路径可以不编写 / 表示应用的根目录开始
      2.4. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 /
    3. RequestMapping的属性
      3.1. path 指定请求路径的url
      3.2. value value属性和path属性是一样的
      3.3. mthod 指定该方法的请求方式
      3.4. params 指定限制请求参数的条件
      3.5. headers 发送的请求中必须包含的请求头

    解决中文编码问题

    直接在web.xml中配置以下内容即可:

      <!-- 解决中文乱码的过滤器-->
      <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>
    

    自定义日期转换器

    我们从前端取得的内容都是String,有些转换Spring会帮我们做,但有些请求Spring做不到。对于这些我们可以自定义一个转换器,如下

    package com.liuge.utils;
    
    import org.springframework.core.convert.converter.Converter;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * @ClassName: StringToDateConverter
     * @Description: 字符串转换成日期
     * @author: LiuGe
     * @date: 2020/5/3  16:58
     */
    public class StringToDateConverter implements Converter<String,Date> {
        /**
         *
         * @param s  传入进来的字符串
         * @return
         */
        @Override
        public Date convert(String s) {
            //判断
            if(s ==null){
                throw new RuntimeException("请您传入数据!");
            }
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    
            try {
                //把字符串转换成日期
                return df.parse(s);
            } catch (Exception e) {
                throw new RuntimeException("数据类型转换出现错误");
            }
        }
    }
    

    然后在spring的配置文件进行配置

    <!-- 配置自定义类型转换器-->
        <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="com.liuge.utils.StringToDateConverter"></bean>
                </set>
            </property>
        </bean>
    

    其他的一些常用注解

    这里有很多注解,不再都记录了。后面用到的时候再看吧。

    SpringMVC的参数绑定

    我们在网页编写中会很常用到表格,对于表格的数据存储和获取一直是个麻烦事,往常我们都会使用request.getParameter,但使用SpringMVC框架我们只需要在对应的方法里加上相同名字的形参即可。对于JavaBean类型,我们在形参写上javaBean类型即可。对于集合类或者嵌套javabean,我们就需要在前面加前缀,如下:

    用户姓名:<input type="text" name="user.uname"><br>
    用户年龄:<input type="text" name="user.age"><br>
    用户姓名:<input type="text" name="list[0].uname"><br>
    用户年龄:<input type="text" name="list[0].age"><br>
    用户姓名:<input type="text" name="map['one'].uname"><br>
    用户年龄:<input type="text" name="map['one'].age"><br>
    

    就可以很方便的存储了。

    总结

    总的来说SpringMVC并没有Spring那么晦涩难懂。内容也不多。估计这个五一假期就能学完SSM框架了吧

  • 相关阅读:
    POJ 1182 食物链 +POJ 2492 A Bug's Life 种类并查集
    Codeforces 884C Bertown Subway dfs判环
    HDU 2102 A计划 bfs
    Codeforces Round #442 (Div. 2) 877E
    Codeforces Round #443 (Div. 2) B. Table Tennis
    Codeforces Round #442 (Div. 2) D. Olya and Energy Drinks
    HDU 1495 非常可乐 BFS/数论
    Codeforces Round #442 (Div. 2) B. Nikita and string DP
    51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈
    HDU 1286 找新朋友
  • 原文地址:https://www.cnblogs.com/wushenjiang/p/12823266.html
Copyright © 2020-2023  润新知