概述
一般基于Java的B/S开发都是三层架构的方式:表现出(SpringMVC)、业务层(Spring)、持久层(MyBatis)
- SpringMVC的M、V、C:
M:model 模型 —JavaBean
V:view 试图 —界面
C:Controller 控制器 —Servlet - 什么是SpringMVC:
SpringMVC是基于Java的实现MVC设计模型的请求驱动类型的Web框架。 - SpringMVC的优势:
清晰的角色划分;分工明确;无需绑定API;和Spring框架无缝集成;可适配支持任意的类做处理器;可定制性;功能强大的数据验证;利用Spring提供的Mock对象可以简单的进行Web单元测试;本地化、主题的解析的支持;强大的JSP标签。
入门Demo
- 环境搭建:
新建maven的Web项目
添加依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</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.4</version>
<scope>provided</scope>
</dependency>
在web.xml中配置springmvc的servlet:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后部署到Tomcat上
- 编写入门demo代码
bean.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.springDemo01"></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>
<!-- 开启SpringMVC框架注解支持-->
<mvc:annotation-driven/>
</beans>
解析bean.xml的方式放在了web.xml文件里面:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--解析bean.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--解析bean完成...-->
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
controller:
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("Hello SpringMVC");
return "success";
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>SpringMVC的demo</h3>
<a href="hello">入门</a>
</body>
</html>
success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门成功</h3>
</body>
</html>
项目结构:
3. RequestMapping注解:
用于建立请求URL和处理请求方法之间的对应关系。
属性:path/value : 设置提交路径;method:设置请求方式;params:用于指定请求参数的条件;header:用于限制请求头的条件。
请求参数
自定义参数:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/param/testParams?username=hhh&id=sdf">请求参数</a>
</body>
</html>
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/testParams")
public String testParams(String username , String id){
System.out.println(username);
System.out.println(id);
return "param";
}
}
封装到类:
新建类–>将controller中方法的参数改成新建的类的对象。
controller:
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println(account);
return "param";
}
domain:
public class Account implements Serializable {
String username;
String id;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", id='" + id + '\'' +
'}';
}
}
jsp:
<form action="/param/testParams">
<input type="text" name="username">
<input type="text" name="id">
<input type="submit" value="提交">
</form>
如果实体类中有其它类的对象表单中的name写法:<input type="text" name="domain.param">
比如有User类的name属性:<input type="text" name="user.name">
解决中文乱码问题:
bean.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>
集合参数封装:
<input type="text" name="list[0].username">
<input type="text" name="map['one'].age">
自定义类型转换器:
springmvc.xml:
<!--配置自定义类型转化器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.springDemo01.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解支持-->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
转换器代码:
public class StringToDateConverter implements Converter<String ,Date> {
/**
* 字符串转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 (ParseException e) {
throw new RuntimeException("转换异常");
}
}
}
获取Servlet原生API
/**
* 获取Servlet原生JPI
* @return
*/
public String servletDemo(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
return "param";
}