spring5mvc第一天【大纲笔记】.pdfSpringMVC框架第一天【随堂笔记】.pdf
spring5mvc第一天【大纲笔记】.pdf
服务器三层框架
表现层:springmvc
业务层:spring
持久层:mybatis

mvc设计模型
model(模型):通常指的就是数据模型(javabean对象)。作用一般情况下用于封装数据
view(视图):通常指jsp或者html。作用一般就是展示数据。通常视图是依据模型数据创建的。
controller(控制器):(servlet)是应用程序中处理用户交互的部分。作用一般就是处理业务逻辑的。
springmvc概述
是基于java的实现mvc设计模型的请求驱动类型的轻量级web框架。他通过一套注解,让一个简单的java类成为处理请求的控制器,而无需实现任何接口。同时还支持restful编程风格的请求。

springMVC的优势
- 清晰的角色划分
前端控制器(DispatcherServlet)
请求到处理器的映射(HandlerMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewReaolver)
处理器或页面控制器(Controller)
验证器(Validator)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object 提供给表单展示的提交到的对象就叫表单对象) - 分工明确,拓展点灵活
- 由于命令对象就是一个
- 和spring其他框架无缝集成,是其他web框架所不具备的
- 可适配,通过HandlerAdapter可以支持任意的类作为处理器
- 可定制性,HandlerMapping、ViewResolver等能够非常简单的定制
- 功能强大的数据验证、格式化、绑定机制
- 利用spring提供的Mock对象能够非常简单的进行web层单元测试
- 本地化、主题的解析的支持,使我们很容易进行国际化和主题的切换
- 强大的jsp标签库,使jsp编写更加容易
。。。。还有RESTFUL风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。
springmvc和struts2的优略分析

springMVC入门程序的配置
1.搭建环境
file - new - module - maven -



创建完成
2.创建文件夹
在main下创建java和resources文件夹,再设置
3.pom.xml文件中引入jar包
<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>
4.配置前端控制器
src - main - webapp - WEB-INF - web.xml
<!--前端控制器-->
<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>
5.配置springmvc
在resources右键new一个springmvc.xml文件

配置beans标签
<?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">
</beans>
6.配置服务器
配置tomcat服务器

springMVC入门程序代码编写
1.删除index.html后再新建index.html或新建一个html文件
编写内容
<%--
Created by IntelliJ IDEA.
User: 17273
Date: 2019/4/10
Time: 19:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="hello">入门程序</a>
</body>
</html>
2.再在java中新建一个java文件
package cn.itcast.controller;
//控制类
public class HelloController {
public String sayHello(){
System.out.println("hello stringmvc");
return "success";
}
}
3.开启注解扫描
在springmvc.xml中添加扫描
<!--开启注解扫描-->
<context:component-scan base-package="cn.itcast"/>
在java文件的类中添加注解@Controller
再在方法上添加请求映射注解@RequestMapping(path = “/hello”),path表示路径
4.使springmvc.xml加载
在前端控制器servlet标签中添加全局初始化参数
<!--加载那个文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--什么时候创建-->
<load-on-startup>1</load-on-startup>
5.新建跳转页面
在web-inf下新建一个文件夹pages,再新建一个success.jsp文件
6.跳转到success页面
在springmvc.xml中配置视图解析器,帮助javabean跳转到指定页面
<!--视图解析器对象--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--文件夹--> <property name="prefix" value="/WEB-INF/pages/"/> <!--文件后缀--> <property name="suffix" value=".jsp"/> </bean>开启springMVC框架注解的支持
<!--开启springmvc框架注解的支持--> <mvc:annotation-driven/>

入门程序总结
RequestMapping注解
作用:用于建立URL和处理请求方法之间的对应关系
属性:
path:指定请求路径的url
value:用于指定请求的url。它和path属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。他支持简单的表达式。要求请求参数的key和value必须和配置一模一样。
例如:
params = {"username"}//传入的参数属性必须是username
params = {"username=hehe"}//插入的属性必须是username,值必须是hehe
headers:用于限制请求消息头的条件。发送的请求中必须包含的请求头
headers = {"Accept"}//请求头中必须有Accept
限制请求方式
@RequestMapping(value = "/testRequestMapping",method = {RequestMethod.POST})
当请求方式不同将报错405

请求参数的绑定
1.普通参数的绑定
直接在方法上添加
<a href="param/testParam?username=hehe">请求参数绑定</a>
/**
* 请求参数绑定
* @param username
* @return
*/
@RequestMapping("/testParam")
public String testParam(String username){
System.out.println(username);
return "success";
}
2.多个参数绑定
<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>
@RequestMapping("/testParam")
public String testParam(String username ,String password){
System.out.println(username);
System.out.println(password);
return "success";
}
3.javabean的封装
属性较多,统一管理
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
<input type="submit" value="提交"/>
</form>
创建Javabean
/**
* 实现序列化接口Serializable
*/
public class Account implements Serializable {
private String username;
private String password;
private Double money;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", user=" + user +
'}';
}
}
/**
* 请求参数绑定把数据封装到javabean的类中
* @param account
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("saveAcount");
System.out.println(account);
return "success";
}
4.应用类型传值
创建user类
public class User implements Serializable {
private String uname;
private Integer age;
private Date date;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", age=" + age +
", date=" + date +
'}';
}
}
在account中添加user类
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", user=" + user +
'}';
jsp
用户姓名:<input type="text" name="user.uname"/><br/>
用户年龄:<input type="text" name="user.age"/><br/>
中文乱码问题
配置过滤器
在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>
5.封装集合
account中添加表单
private List<User> list;
private Map<String,User> map;
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
@Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", list=" + list +
", map=" + map +
'}';
}
jsp
<%--把数据封装account类中,类中存在list和map集合--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
<!--list-->
用户姓名:<input type="text" name="list[0].uname"/><br/>
用户年龄:<input type="text" name="list[0].age"/><br/>
<!--map-->
用户姓名:<input type="text" name="map['one'].uname"/><br/>
用户年龄:<input type="text" name="map['one'].age"/><br/>
<input type="submit" value="提交"/>
</form>
自定义类型转换器
从jsp中闯入的数据都是string类型的,springmvc会自动将string类型的数据转成设计的类型,基本类型都可以转,但存在一个问题,不同的格式可能会导致失败。
例:字符串2000/01/05可以转成日期2000年1月5日,但2000-01-05可能就转不了
jsp中重写一个表单
<form action="param/saveUser" method="post">
用户姓名:<input type="text" name="uname"/><br/>
用户年龄:<input type="text" name="age"/><br/>
用户生日:<input type="text" name="date"/><br/>
<input type="submit" value="提交"/>
</form>
user中添加一个属性date
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", age=" + age +
", date=" + date +
'}';
}
controller中加一个方法saveUser
@RequestMapping("/saveUser")
public String saveUser(User user){
System.out.println("执行了");
System.out.println(user);
return "success";
}
测试:



解决步骤:
- 新建一个类型转换器until.stringtodateconvrter
import org.springframework.core.convert.converter.Converter;
import java.text.*;
import java.util.Date;
/**
* 把字符串转换日期,string指传入的字符串,date指要转的类型(这里是转日期类型)
*/
public class StringToDateConverter implements Converter<String, Date> {
@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("数据类型转换出现错误");
}
}
}
- 在springmvc.xml中配置类型转换器组件
<!--配置自定义类型转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.util.StringToDateConverter"></bean>
</set>
</property>
</bean>
- 让组件生效
在springmvc.xml中的mvc:annotation-driven标签中添加conversion-service
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
获取servlet原生API
想获得什么就在controller的方法上加参数就行
构建一个方法获取
@RequestMapping("/testServlet")
public String saveServlet(HttpServletRequest request, HttpServletResponse response){
//获取的都是地址
System.out.println("执行了");
//获取地址确定是否获取到api
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
System.out.println(response);
return "success";
}
常用注解
1.requestparam
作用:
把请求中指定名称的参数给控制器中的形参赋值(jsp的参数名可与方法中的不同)
属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,否则报错
<a href="anno/testRequestParam?name=哈哈">Servlet原生API</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username ){
System.out.println("执行了。。。");
System.out.println(username);
return "success";
}
}
2.RequestBody(异步使用)
作用:
用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据
get请求方式不适用
属性:
required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为fasle,get请求得到的是null。
<form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username"/><br/>
用户年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交"/>
</form>
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body ){
System.out.println("执行了。。。");
System.out.println(body);
return "success";
}

3.PathVariable
作用:
用于绑定URL中的占位符。URL支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的重要标志
例:请求url中/delete/{id},这个{id}就是URL占位符。
属性:
value:用于指定URL中占位符名称
required:是否必须提供占位符
<a href="anno/testPathVariable/10">testPathVariable</a>
<!--直接接数值-->
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id ){
System.out.println("执行了。。。");
System.out.println(id);
return "success";
}
4.HiddentHttpMethodFilter过滤器
作用:由于浏览器from表单只支持GET和POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们控制器方法,使得支持GET、POST、PUT与DELETE请求。
方法:
第一步:在web. xml中配置该过滤器
第二步:请求方式必须使用post请求
第三步:按照要求提供method请求参数,该参数的取值就是我们需要的请求方式
只需了解,webclient使用静态方法发送请求,模拟各种请求方式,浏览器也有插件来实现
5.requestheader注解(了解)
作用:
用于获取请求消息头
<a href="anno/testRequestHeader">testRequestHeader</a>
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println("执行了。。。");
System.out.println(header);
return "success";
}
6.CookieValue
作用:
用于把指定cookie名称的值传入控制器方法参数
<a href="anno/testCookieValue">testCookieValue</a>
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value ="JSESSIONID") String cookieValue){
System.out.println("执行了。。。");
System.out.println(cookieValue);
return "success";
}
7.ModelAttribute
作用:
可修饰方法和参数,出现方法上,表示当前方法会在控制器方法执行之前执行。可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。可以出现在参数上,获取指定的数据给参数赋值。
方法1 :
<form action="anno/testModelAttribute" method="post">
用户姓名:<input type="text" name="uname"/><br/>
用户年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交"/>
</form>
@RequestMapping("/testModelAttribute")
public String testModelAttribute( User user){
System.out.println("执行了。。。");
System.out.println(user);
return "success";
}
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser执行了。。。");
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
方法二:
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("执行了。。。");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String uname , Map<String,User> map){
System.out.println("showUser执行了。。。");
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}
8. SessionAttributes
作用:用于多次执行控制器方法间的参数共享
@RequestMapping(value = "/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes。。。");
model.addAttribute("msg","美美");
return "success";
}
@RequestMapping(value = "getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("getSessionAttributes");
String msg =(String) modelMap.get("msg");
System.out.println(msg);
return "success";
}
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">SessionAttributes</a>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>成功</h3>
${requestScope.msg}
${sessionScope}
</body>
</html>



