1、springMVC常用注解-01
1.1、新建springmvc项目
1.1.1、创建新项目
通过maven创建一个新项目smvc002
1.1.2、导包
pom.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<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
代码语言:javascript复制<?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.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
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<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
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
执行成功!!!!
</body>
</html>
创建:TestController.java
代码语言:javascript复制import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller("testController")
public class TestController {
@RequestMapping("/testParams")
public String testRequestParams(@RequestParam("username") String uname,@RequestParam(value="password") String pword){
System.out.println(uname ":" pword);
return "index";
}
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制@RequestMapping("/testBody")
public String testRequestBody(@RequestBody(required = false) String body){
System.out.println(body);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制@RequestMapping("/testPath/{mid}")
public String testPathVariable(@PathVariable("mid") Integer mid){
System.out.println(mid);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制 @RequestMapping("/testHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language",required = false) String header){
System.out.println(header);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制@RequestMapping("/testCookie")
public String testCookieValue(@CookieValue(value="JSESSIONID",required = false) String cookie){
System.out.println(cookie);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制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;
@Controller("testController")
@SessionAttributes(value={"username","password"},types={Integer.class})
public class TestController {
@RequestMapping("/testSet")
public String setSession(Model model){
System.out.println("存入数据:");
model.addAttribute("username","zhangsan");
model.addAttribute("password","zhangsan123456");
return "index";
}
@RequestMapping("/testGet")
public String getSession(ModelMap modelMap){
System.out.println("获取数据:");
System.out.println(modelMap.get("username") ":" modelMap.get("password"));
return "index";
}
@RequestMapping("/testClear")
public String clearSession(SessionStatus sessionStatus){
System.out.println("清除数据");
sessionStatus.setComplete();
return "index";
}
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制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;
}
@Override
public String toString() {
return "Manager{"
"mid=" mid
", uname='" uname '''
", pword='" pword '''
'}';
}
}
创建:TestController.java
代码语言:javascript复制@ModelAttribute
public void viewModel(Manager m){
System.out.println("执行到了这里:" m.getUname());
}
@RequestMapping("/testModel")
public String testModelAttribute(Manager m){
System.out.println("执行到了控制器这里:" m.getUname());
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制//查询数据库操作
@ModelAttribute
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;
}
@RequestMapping("/testFind")
public String findBy(Manager m){
System.out.println(m);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制 @ModelAttribute
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;
}
@RequestMapping("/testFind1")
public String findBy1(@ModelAttribute("m1")Manager m){
System.out.println(m);
return "index";
}
创建:index.jsp
代码语言:javascript复制<%@ 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
字符串可以用来指定逻辑视图名,通过视图解析器解析为物理视图地址。
代码语言:javascript复制@RequestMapping("/testBody")
public String testRequestBody(@RequestBody(required = false) String body){
System.out.println(body);
return "index";
}
return "index";
通过视图解析器后:
/pages/index.jsp
5.2、返回值为:void
void可以用在ServletAPI对象的控制器中。
代码语言:javascript复制@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、可以做页面跳转
服务器端页面跳转
代码语言:javascript复制request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request,
response);
5.2.2、重定向
客户端页面跳转
代码语言:javascript复制response.sendRedirect("index")
5.2.3、json数据
将json数据打印到浏览器
代码语言:javascript复制response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
5.3、返回值为:ModelAndView
ModelAndView是由Spring提供的对象,他里面存储了视图名称或视图对象以及一些模型属性。
ModelAndView中的常用方法:
代码语言:javascript复制//
//页面上可以直接获取:${attributeValue}
public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
this.getModelMap().addAttribute(attributeName, attributeValue);
return this;
}
//用于设置视图名称,视图解析器会根据名称前往指定的视图
public void setViewName(@Nullable String viewName) {
this.view = viewName;
}
5.3.1、需求
完成用户名、密码输入后登录
5.3.2、登录页面
/pages/login.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制import com.tyschool.smvc002.javabean.Manager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping("/login")
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
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功!</title>
</head>
<body>
登录成功!${uname}
</body>
</html>
6、转发与重定向
6.1、forward转发
代码语言:javascript复制//视图解析器产生地址
@RequestMapping("/testFind1")
public String findBy1(@ModelAttribute("m1")Manager m){
System.out.println(m);
return "index";
}
//用forward后,需要写入实际地址
@RequestMapping("/testForward")
public String testForward(){
return "forward:/pages/index.jsp";
}
注意:
foward相当于request.getRequestDispatcher(“url”).forward(request,response),服务器端跳转。
6.2、Redirect重定向
代码语言:javascript复制@RequestMapping("/testForward")
public String testForward(){
return "forward:/pages/index.jsp";
}
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("执行了1。。。。。。。");
return "redirect:testForward";
}
@RequestMapping("/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
代码语言:javascript复制<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
代码语言:javascript复制<mvc:annotation-driven />
<mvc:annotation-driven />会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean
AnnotationMethodHandlerAdapter将会初始化7个转换器
代码语言:javascript复制ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
对于json的解析就是通过MappingJacksonHttpMessageConverter转换器完成的。
7.3.2、JsonController.java
代码语言:javascript复制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;
@Controller("jsonController")
public class JsonController {
@RequestMapping(value="/testJson",method = RequestMethod.POST, consumes = "application/json")
public @ResponseBody Manager testJsonOne(@RequestBody Manager m){
System.out.println("12321321");
System.out.println(m);
return m;
}
}
7.3.3、index.jsp
代码语言:javascript复制<%@ 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>