版本:idea2020.1.1 jdk1.8 maven3.6.3
注:本文章摘自Java EE企业级应用开发教程,黑马程序员/编著,仅用于记录学习笔记,分享学习经历。
Tomcat配置参考:https://mp.youkuaiyun.com/editor/html/114296147
目录结构和路径很重要,如下
一、JSON数据交互
JSON(JavaScript Object Notation,JS对象标记),有两种数据结构
1、对象结构
以 “{” 开始,以 “}” 结束,中间用英文逗号分隔,数据由name:value构成。
{key1:value1,key2:value2,......}
其中key必须是String类型,value可以是任意数据类型,例如:
{"city":"Beijing","street":"Xisanqi","postcode":10096}
2、数组结构
以 “[” 开始,以 “]” 结束,中间用英文逗号分隔.
[value1,value2,...]
例如,一个包含了String、Number、Boolean、null类型数据,使用JSON的表示形式为:
["abc",123,false,null]
3、对象结构与数组结构组合使用
{
"name":"zhangsan",
"hobby":["篮球","羽毛球"],
"address":{
"city":"Beijing",
"street":Xisanqi",
"postcode":1111
}
}
4、JSON数据转换
为了实现浏览器与控制器类(Controller)之间的数据交互,SPring提供了一个HttpMessageConverter<T>接口来完成此项工作。该接口主要用于将请求信息中的数据转换为一个类型为T的对象,并将类型为T的对象绑定到请求方法的参数中,或将对象转换为响应信息传递给浏览器显示。
Spring为HttpMessageConverter<T>接口提供了很多实现类,这些实现类可以对不同类型的数据进行信息转换。其中MappingJackson2HttpMessageConverter是Spring MVC默认处理JSON格式请求响应的实现类。该实现类利用Jackson开源包读写JSON数据,将Java对象转换为JSON对象和XML文档,同时也将JSON对象和XML文档转换为Java对象。
注解 | 说明 |
---|---|
@RequestBody | 用于将请求体中的数据绑定到方法的形参中。该注解用在方法的形参上。 |
@ResponseBody | 用于直接返回return对象,该注解用在方法上。 |
导入maven依赖 ——> 编写web.xml ——>编写springmvc-config.xml ——> 编写User ——> 编写index.jsp ——> 编写UserController ——> 测试
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- Spring dao依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- Spring test依赖:方便做单元测试和集成测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
</dependencies>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置编码过滤器-->
<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>
<servlet>
<!--配置前端过滤器-->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化时加载配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--拦截所有url-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<?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-4.3.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.jc.controller"/>
<!--定义视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--配置注解驱动-->
<mvc:annotation-driven />
<!--配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截-->
<mvc:resources mapping="/js/**" location="/js/"/>
</beans>
<mvc:annotation-driver/>配置会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个Bean,并提供对读写XML和读写JSON等功能的支持。
<mvc:resource/>元素用于配置静态资源访问路径。由于在web.xml中配置"/"会将页面引入的静态文件进行拦截,而拦截后页面中将找不到这些静态资源文件,这样就会引起页面报错。而增加了静态资源的访问映射配置后,程序会自动地去配置路径下找静态的内容。
属性 | 说明 |
---|---|
location | 用于定位需要访问的本地静态资源文件路径,具体到某个文件夹 |
mapping | 匹配静态资源全路径,其中"/**"表示文件夹及子文件夹下的某个具体文件 |
package com.jc.pojo;
/**
* @author Lucifer
* @create 2021-04-12 上午 10:32
*/
public class User {
private String username;
private String password;
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>测试JSON交互</title>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function testJson() {
//获取输入的用户名和密码
var username = $("#username").val();
var password = $("#password").val();
$.ajax({
url:"${pageContext.request.contextPath }/testJson",
type:"post",
//data表示发送的数据
data:JSON.stringify({username:username,password:password}),
//定义发送请求的数据格式为JSON字符串
contentType:"application/json;charset=UTF-8",
//定义回调响应的数据格式为JSON字符串,该属性可以省略
dataType:"json",
//成功响应的结果
success:function (data) {
if (data != null) {
alert("您输入的用户名为:"+data.username+"密码为:"+data.password);
}
}
});
}
</script>
</head>
<body>
<%--次代码因为el表达式不起作用--%>
<%@ page isELIgnored="false" %>
<form>
用户名:<input type="text" name="username" id="username"/><br/>
密码:<input type="password" name="password" id="password"/><br/>
<input type="button" value="测试JSON交互" onclick="testJson()"/>
</form>
</body>
</html>
@Controller
public class UserController {
//接收页面请求的JSON数据,并返回JSON格式结果
@RequestMapping("/testJson")
@ResponseBody
public User tsetJson(@RequestBody User user) {
//打印接收的JSON格式数据
System.out.println(user);
//返回JSON格式的响应
return user;
}
}
使用<bean>标签方式的JSON转换器配置
<!--<bean>标签配置注解方式的处理器映射器和处理器适配器必须配对使用-->
<!--使用<bean>标签配置注解方式的处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--使用<bean>标签配置注解方式的处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!--在注解适配器中配置JSON转换器-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
配置静态资源访问的方式
(1)使用<mvc:default-servlet-handler>标签
在springmvc-config.xml文件中使用
<mvc:default-servlet-handler />
配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler(即默认的Servlet请求处理器)。它对进入DispatcherServlet的URL进行筛查。如果发现是静态资源的请求,就将该请求转由Web服务器默认的Servlet处理,默认的Servlet就会对这些静态资源放行,如果不是静态资源的请求,才由DispatcherServlet继续处理。
一般Web服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果使用的Web应用服务器默认的Servlet名称不是"default",则需要通过default-servlet-name属性指定。
<mvc:default-servlet-handler default-servlet-name="Servlet名称"/>
Web服务器的Servlet名称是由使用的服务器确定的,常用服务器及其Servlet名称如下。
Web服务器 | Servlet默认名称 |
---|---|
Tomcat、Jetty、JBoss、and GlassFish | default |
Google App Engine | _ah_default |
Resin | resin-file |
WebLogic | FileServlet |
WebSphere | SimpleFileServlet |
(2)激活Tomcat默认的Servlet来处理静态文件访问,需要在web.xml中添加以下内容。
<!--激活tomcat的静态资源拦截-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
访问方式 | 优点 | 缺点 |
---|---|---|
<mvc:resources mapping="/js/**" location="/js/"/> | 选择性释放静态资源 | |
<mvc:default-servlet-handler /> | 配置简单,只需要一行代码,就可以释放所有静态资源 | 项目移植性差,需要根据web服务器来更改Servlet名称 |
<servlet-mapping> | 选择性释放静态资源,运行效率高,因为服务器启动已经加载了web.xml中的静态资源 | 项目移植性差,需要根据web服务器来更改Servlet名称 |
二、RESTful支持
1、RESTful
也称之为REST(Representational State Transfer),可以将其理解为一种软件架构风格或设计风格,而不是一个标准。就是把请求参数编程请求路径的一中和风格。
传统URL格式为:
http://.../queryItems?id=1
RESTful风格URL为:
http://...items/1
在UserController中编写selectUser()方法 ——> 编写restful.jsp ——> 运行测试查看结果
//接收RESTful风格的请求,其接收方式为GET
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
@ResponseBody
public User seletUser(@PathVariable("id") String id) {
//查看数据接收
System.out.println("id="+id);
User user = new User();
//模拟根据id查询出到用户对象数据
if (id.equals("1234")) {
user.setUsername("tom");
}
//返回JSON格式数据
return user;
}
<%--
Created by IntelliJ IDEA.
User: jiangchao
Date: 2021/4/12
Time: 下午 9:59
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP '' starting page</title>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function search() {
//获取输入的查询编号
var id = $("#number").val();
$.ajax({
url:"${pageContext.request.contextPath }/user/"+id,
type:"GET",
//定义回调响应的数据格式为JSON字符串,该属性可以省略
DataType:"json",
//成功响应的结果
success:function (data) {
if (data.username != null) {
alert("您查询的用户是:"+data.username);
}else {
alert("没有找到id为:"+id+"的用户!");
}
}
});
}
</script>
</head>
<body>
<%@ page isELIgnored="false" %>
<form>
编号:<input type="text" name="number" id="number"/>
<input type="button" value="搜索" onclick="search()"/>
</form>
</body>
</html>