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";
}
}
网友评论