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框架了吧

posted @ 2020-05-03 20:27  武神酱丶  阅读(178)  评论(0编辑  收藏  举报