共计 16010 个字符,预计需要花费 41 分钟才能阅读完成。
1、springMVC 常用注解 -01
1.1、新建 springmvc 项目
1.1.1、创建新项目
通过 maven 创建一个新项目 smvc002
1.1.2、导包
pom.xml
<?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
<?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
<?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
<%@ 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;
@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
<%@ 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
@RequestMapping("/testBody")
public String testRequestBody(@RequestBody(required = false) String body){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
@RequestMapping("/testPath/{mid}")
public String testPathVariable(@PathVariable("mid") 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
@RequestMapping("/testHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language",required = false) String header){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
@RequestMapping("/testCookie")
public String testCookieValue(@CookieValue(value="JSESSIONID",required = false) String cookie){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;
@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
<%@ 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;
}
@Override
public String toString() {return "Manager{" +
"mid=" + mid +
", uname='" + uname + '\'' +
", pword='" + pword + '\'' +
'}';
}
}
创建:TestController.java
@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
<%@ 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
// 查询数据库操作
@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
<%@ 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
@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
<%@ 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
字符串可以用来指定逻辑视图名,通过视图解析器解析为物理视图地址。
@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 对象的控制器中。
@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, @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
<%@ 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;
@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
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title> 登录成功!</title>
</head>
<body>
登录成功!${uname}
</body>
</html>
6、转发与重定向
6.1、forward 转发
// 视图解析器产生地址
@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 重定向
@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
<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;
@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
<%@ 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>