共计 16010 个字符,预计需要花费 41 分钟才能阅读完成。
1、springMVC 常用注解 -01
1.1、新建 springmvc 项目
1.1.1、创建新项目
通过 maven 创建一个新项目 smvc002
1.1.2、导包
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
<modelVersion>4.0.0</modelVersion> | |
<groupId>com.tyschool</groupId> | |
<artifactId>smvc002</artifactId> | |
<version>1.0-SNAPSHOT</version> | |
<packaging>war</packaging> | |
<name>smvc002 Maven Webapp</name> | |
<!-- FIXME change it to the project's website --> | |
<url>http://www.example.com</url> | |
<properties> | |
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
<maven.compiler.source>1.7</maven.compiler.source> | |
<maven.compiler.target>1.7</maven.compiler.target> | |
<spring.version>5.2.2.RELEASE</spring.version> | |
</properties> | |
<dependencies> | |
<dependency> | |
<groupId>junit</groupId> | |
<artifactId>junit</artifactId> | |
<version>4.11</version> | |
<scope>test</scope> | |
</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> | |
</dependencies> | |
<build> | |
<finalName>smvc002</finalName> | |
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> | |
<plugins> | |
<plugin> | |
<artifactId>maven-clean-plugin</artifactId> | |
<version>3.1.0</version> | |
</plugin> | |
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> | |
<plugin> | |
<artifactId>maven-resources-plugin</artifactId> | |
<version>3.0.2</version> | |
</plugin> | |
<plugin> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<version>3.8.0</version> | |
</plugin> | |
<plugin> | |
<artifactId>maven-surefire-plugin</artifactId> | |
<version>2.22.1</version> | |
</plugin> | |
<plugin> | |
<artifactId>maven-war-plugin</artifactId> | |
<version>3.2.2</version> | |
</plugin> | |
<plugin> | |
<artifactId>maven-install-plugin</artifactId> | |
<version>2.5.2</version> | |
</plugin> | |
<plugin> | |
<artifactId>maven-deploy-plugin</artifactId> | |
<version>2.8.2</version> | |
</plugin> | |
</plugins> | |
</pluginManagement> | |
</build> | |
</project> |
1.1.3、启动服务
启动服务、配置服务
http://localhost:8080/smvc002/index.jsp
1.1.4、配置 springmvc.xml 文件
springmvc.xml
<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.xsd | |
http://www.springframework.org/schema/context | |
http://www.springframework.org/schema/context/spring-context.xsd | |
http://www.springframework.org/schema/mvc | |
http://www.springframework.org/schema/mvc/spring-mvc.xsd | |
"> | |
<!-- 配置扫描器,扫描注解 --> | |
<context:component-scan base-package="com.tyschool"></context:component-scan> | |
<!-- 配置视图解析器,配置前缀和后缀 --> | |
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> | |
<property name="prefix" value="/pages/"></property> | |
<property name="suffix" value=".jsp"></property> | |
</bean> | |
</beans> |
1.1.5、配置 web.xml 文件
web.xml
<web-app | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xmlns="http://xmlns.jcp.org/xml/ns/javaee" | |
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee | |
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" | |
id="WebApp_ID" version="3.1"> | |
<display-name>Archetype Created Web Application</display-name> | |
<!-- 配置 SpringMVC 核心, 前置控制器 DispatcherServlet --> | |
<servlet> | |
<servlet-name>SpringMVCDispathcherServlet</servlet-name> | |
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> | |
<!-- 配置初始化参数,用来读取 springmvc.xml 文件 --> | |
<init-param> | |
<param-name>contextConfigLocation</param-name> | |
<param-value>/WEB-INF/springmvc.xml</param-value> | |
</init-param> | |
<!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序 --> | |
<load-on-startup>1</load-on-startup> | |
</servlet> | |
<!-- 前置控制器,映射所有地址 --> | |
<servlet-mapping> | |
<servlet-name>SpringMVCDispathcherServlet</servlet-name> | |
<url-pattern>/</url-pattern> | |
</servlet-mapping> | |
</web-app> |
1.2、RequestParam
1.2.1、作用
将请求中指定名称的参数,给控制器中的形参赋值。
1.2.2、属性
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
1.2.3、案例
创建:index.jsp
pages/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<head> | |
<title>Title</title> | |
</head> | |
<body> | |
执行成功!!!!</body> | |
</html> |
创建:TestController.java
import org.springframework.stereotype.Controller; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.bind.annotation.RequestParam; | |
public class TestController { | |
public String testRequestParams( String uname, String pword){System.out.println(uname+":"+pword); | |
return "index"; | |
} | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<form action="testParams" method="post"> | |
username:<input type="text" name="username"/> | |
password:<input type="text" name="password"/> | |
<input type="submit" value="登录"> | |
</form> | |
</body> | |
</html> | |
2、springMVC 常用注解 -02
2.1、RequestBody
2.1.1、作用
用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
2.1.2、属性
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。
2.1.3、案例
创建:TestController.java
"/testBody") | (|
public String testRequestBody(false) String body){ (required = System.out.println(body); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<form action="testBody" method="post"> | |
username:<input type="text" name="username"/> | |
password:<input type="text" name="password"/> | |
<input type="submit" value="登录"> | |
</form> | |
</body> | |
</html> | |
2.2、PathVariable
2.2.1、作用
用于绑定 url 中的占位符。
例如:请求 url 中 /delete/{id},这个 **{id}** 就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
2.2.2、属性
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
2.2.3、案例
创建:TestController.java
public String testPathVariable( Integer mid){System.out.println(mid); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<a href="testPath/1">pathVariable 注解 </a> | |
</body> | |
</html> |
2.3、RequestHeader
2.3.1、作用
用于获取请求消息头。
2.3.2、属性
value:提供消息头名称
required:是否必须有此消息头
2.3.3、案例
创建:TestController.java
"/testHeader") | (|
public String testRequestHeader("Accept-Language",required = false) String header){ (value=System.out.println(header); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<a href="testHeader">RequestHeader 注解 </a> | |
</body> | |
</html> |
注意:
3、springMVC 常用注解 -03
3.1、CookieValue
3.1.1、作用
用于把指定 cookie 名称的值传入控制器方法参数。
3.1.2、属性
value:指定 cookie 的名称。
required:是否必须有此 cookie。
3.1.3、案例
创建:TestController.java
"/testCookie") | (|
public String testCookieValue("JSESSIONID",required = false) String cookie){ (value=System.out.println(cookie); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<a href="testCookie">CookieValue 注解 </a> | |
</body> | |
</html> |
注意:
3.2、SessionAttribute
3.2.1、作用
用于多次执行控制器方法间的参数共享。。
3.2.2、属性
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
3.2.3、案例
需求:
完成登录信息的缓存、获取、清除
创建:TestController.java
import org.springframework.stereotype.Controller; | |
import org.springframework.ui.Model; | |
import org.springframework.ui.ModelMap; | |
import org.springframework.web.bind.annotation.*; | |
import org.springframework.web.bind.support.SessionStatus; | |
public class TestController { | |
public String setSession(Model model){System.out.println("存入数据:"); | |
model.addAttribute("username","zhangsan"); | |
model.addAttribute("password","zhangsan123456"); | |
return "index"; | |
} | |
public String getSession(ModelMap modelMap){System.out.println("获取数据:"); | |
System.out.println(modelMap.get("username")+":"+modelMap.get("password")); | |
return "index"; | |
} | |
public String clearSession(SessionStatus sessionStatus){System.out.println("清除数据"); | |
sessionStatus.setComplete(); | |
return "index"; | |
} | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<a href="testSet"> 登录信息缓存 </a><br/> | |
<a href="testGet"> 登录信息获取 </a><br/> | |
<a href="testClear"> 登录信息清除 </a> | |
</body> | |
</html> |
4、springMVC 常用注解 -04
4.1、ModelAttribute
4.1.1、作用
可以用于修饰方法和参数:
出现在方法上:表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上:获取指定的数据给参数赋值。
4.1.2、属性
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
4.2、案例
4.2.1、案例 -pojo- 修饰方法
创建:Manager.java
import java.io.Serializable; | |
public class Manager implements Serializable {private int mid; | |
private String uname; | |
private String pword; | |
public int getMid() {return mid; | |
} | |
public void setMid(int mid) {this.mid = mid; | |
} | |
public String getUname() {return uname; | |
} | |
public void setUname(String uname) {this.uname = uname; | |
} | |
public String getPword() {return pword; | |
} | |
public void setPword(String pword) {this.pword = pword; | |
} | |
public String toString() {return "Manager{" + | |
"mid=" + mid + | |
", uname='" + uname + '\'' + | |
", pword='" + pword + '\'' + | |
'}'; | |
} | |
} |
创建:TestController.java
public void viewModel(Manager m){System.out.println("执行到了这里:"+m.getUname()); | |
} | |
"/testModel") | (|
public String testModelAttribute(Manager m){System.out.println("执行到了控制器这里:"+m.getUname()); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<a href="testModel?uname=zhangsan">ModelAttribute 注解 </a> | |
</body> | |
</html> |
4.2.2、案例 -Map- 修饰方法 - 带返回值
需求:
通过 id,完成管理员信息查询。带返回值处理
创建:TestController.java
// 查询数据库操作 | |
public Manager viewModel(int mid){Manager m=findById(mid); | |
System.out.println("执行到了这里:"+m); | |
return m; | |
} | |
// 模拟查询操作 | |
Manager findById(int mid){Manager m=new Manager(); | |
m.setUname("zhangsan"); | |
m.setPword("lisi"); | |
m.setMid(mid); | |
return m; | |
} | |
"/testFind") | (|
public String findBy(Manager m){System.out.println(m); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<form action="testFind" method="post"> | |
mid:<input type="text" name="mid" ><br/> | |
<input type="submit" value="查询"> | |
</form> | |
</body> | |
</html> |
4.2.3、案例 -Map- 修饰方法 - 不带返回值
需求:
通过 id,完成管理员信息查询。不带返回值处理
创建:TestController.java
public void viewModel1(int mid, Map<String,Manager> map){Manager m=findById1(mid); | |
System.out.println("执行到这里的:"+m); | |
map.put("m1",m); | |
} | |
// 查询数据库操作 | |
public Manager findById1(int mid){Manager m=new Manager(); | |
m.setUname("zhangsan"); | |
m.setPword("lisi"); | |
m.setMid(mid); | |
return m; | |
} | |
"/testFind1") | (|
public String findBy1("m1")Manager m){ (System.out.println(m); | |
return "index"; | |
} |
创建:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<body> | |
<form action="testFind1" method="post"> | |
mid:<input type="text" name="mid" ><br/> | |
<input type="submit" value="查询"> | |
</form> | |
</body> | |
</html> |
5、数据响应
5.1、返回值为:String
字符串可以用来指定逻辑视图名,通过视图解析器解析为物理视图地址。
"/testBody") | (|
public String testRequestBody(false) String body){ (required = System.out.println(body); | |
return "index"; | |
} | |
return "index"; | |
通过视图解析器后:/pages/index.jsp |
5.2、返回值为:void
void 可以用在 ServletAPI 对象的控制器中。
@RequestMapping("/servletapi") | |
public void sayServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){System.out.println(request); | |
System.out.println(response); | |
System.out.println(session); | |
} |
5.2.1、可以做页面跳转
服务器端页面跳转
request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request, | |
response); |
5.2.2、重定向
客户端页面跳转
response.sendRedirect("index")
5.2.3、json 数据
将 json 数据打印到浏览器
response.setCharacterEncoding("utf-8"); | |
response.setContentType("application/json;charset=utf-8"); | |
response.getWriter().write("json 串"); |
5.3、返回值为:ModelAndView
ModelAndView 是由 Spring 提供的对象,他里面存储了视图名称或视图对象以及一些模型属性。
ModelAndView 中的常用方法:
// | |
// 页面上可以直接获取:${attributeValue} | |
public ModelAndView addObject(String attributeName, Object attributeValue) {this.getModelMap().addAttribute(attributeName, attributeValue); | |
return this; | |
} | |
// 用于设置视图名称,视图解析器会根据名称前往指定的视图 | |
public void setViewName(String viewName) { this.view = viewName; | |
} |
5.3.1、需求
完成用户名、密码输入后登录
5.3.2、登录页面
/pages/login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<head> | |
<title> 登录页面 </title> | |
</head> | |
<body> | |
<form action="${pageContext.request.contextPath}/login" method="post"> | |
用户名:<input type="text" name="uname"/> | |
密码:<input type="password" name="pword"/> | |
<input type="submit" value="登录"/> | |
<label>${error}</label> | |
</form> | |
</body> | |
</html> |
5.3.3、登录控制器
LoginController.java
import com.tyschool.smvc002.javabean.Manager; | |
import org.springframework.stereotype.Controller; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.servlet.ModelAndView; | |
public class LoginController { | |
public ModelAndView loginManager(Manager m){ModelAndView modelAndView=new ModelAndView(); | |
if("admin".equals(m.getUname())&&"admin".equals(m.getPword())){modelAndView.addObject("uname",m.getUname()); | |
modelAndView.setViewName("win"); | |
}else{modelAndView.addObject("error","用户名密码错误"); | |
modelAndView.setViewName("login"); | |
} | |
return modelAndView; | |
} | |
} | |
5.3.4、登录成功页面
/pages/win.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<head> | |
<title> 登录成功!</title> | |
</head> | |
<body> | |
登录成功!${uname} | |
</body> | |
</html> |
6、转发与重定向
6.1、forward 转发
// 视图解析器产生地址 | |
"/testFind1") | (|
public String findBy1("m1")Manager m){ (System.out.println(m); | |
return "index"; | |
} | |
// 用 forward 后,需要写入实际地址 | |
"/testForward") | (|
public String testForward(){return "forward:/pages/index.jsp"; | |
} |
注意:
foward 相当于 request.getRequestDispatcher(“url”).forward(request,response),服务器端跳转。
6.2、Redirect 重定向
"/testForward") | (|
public String testForward(){return "forward:/pages/index.jsp"; | |
} | |
"/testRedirect") | (|
public String testRedirect(){System.out.println("执行了 1。。。。。。。"); | |
return "redirect:testForward"; | |
} | |
"/testRedirect1") | (|
public String testRedirect1(){System.out.println("执行了 2。。。。。。。"); | |
return "redirect:/pages/index.jsp"; | |
} |
注意:
redirect 相当于 response.sendRedirect(url),客户端跳转。
重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
7、JSON 数据响应
7.1、@ResponseBody
将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端
7.2、导入对应的 jar 包
Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。
pom.xml
<jackson.version>2.10.1</jackson.version> | |
<dependency> | |
<groupId>com.fasterxml.jackson.core</groupId> | |
<artifactId>jackson-core</artifactId> | |
<version>${jackson.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.fasterxml.jackson.core</groupId> | |
<artifactId>jackson-annotations</artifactId> | |
<version>${jackson.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>com.fasterxml.jackson.core</groupId> | |
<artifactId>jackson-databind</artifactId> | |
<version>${jackson.version}</version> | |
</dependency> |
7.3、案例
7.3.1、加入配置
springmvc.xml
<mvc:annotation-driven />
<mvc:annotation-driven /> 会自动注册 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 两个 bean
AnnotationMethodHandlerAdapter 将会初始化 7 个转换器
ByteArrayHttpMessageConverter | |
StringHttpMessageConverter | |
ResourceHttpMessageConverter | |
SourceHttpMessageConverter | |
XmlAwareFormHttpMessageConverter | |
Jaxb2RootElementHttpMessageConverter | |
MappingJacksonHttpMessageConverter |
对于 json 的解析就是通过 MappingJacksonHttpMessageConverter 转换器完成的。
7.3.2、JsonController.java
import com.tyschool.smvc002.javabean.Manager; | |
import org.springframework.stereotype.Controller; | |
import org.springframework.web.bind.annotation.RequestBody; | |
import org.springframework.web.bind.annotation.RequestMapping; | |
import org.springframework.web.bind.annotation.RequestMethod; | |
import org.springframework.web.bind.annotation.ResponseBody; | |
public class JsonController { | |
public Manager testJsonOne( Manager m){System.out.println("12321321"); | |
System.out.println(m); | |
return m; | |
} | |
} |
7.3.3、index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> | |
<html> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> | |
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> | |
<script type="text/javascript"> | |
$(function(){$("#testJsonClick").click(function(){ | |
$.ajax({type:"post", | |
url:"testJson", | |
contentType:"application/json;charset=utf-8", | |
data:'{"mid":1,"uname":"zhangsan","pword":"123456"}', | |
dataType:"json", | |
success:function(data){console.log(data); | |
} | |
}); | |
}); | |
}) | |
</script> | |
</head> | |
<body> | |
<button id="testJsonClick"> 单击 </button> | |
</body> | |
</html> |
