写在前面
在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的解释
- RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
- RequestMapping注解可以作用在方法和类上
2.1. 作用在类上:第一级的访问目录
2.2. 作用在方法上:第二级的访问目录
2.3. 细节:路径可以不编写 / 表示应用的根目录开始
2.4. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 / - 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框架了吧