Java - 服务器端数据传输(一)

1. 服务器向客户端响应处理结果的方式

目前,控制器向客户端响应方式有转发和重定向,在大型应用及规范的开发模式下,一般是不建议使用的!因为转发或重定向都会让客户端去请求另一个页面,显示页面会存在一些问题,例如:不适用于多种不同类型的客户端,响应时产生的数据交互量较大,传输速度偏慢,流量消耗较大,用户体验较差!目前推荐的做法就是**服务器只向客户端响应必要的数据,至于数据如何呈现,由客户端技术去解决!**这种做法还会带来另一个好处,就是开发人员的职责的分离,服务器端开发人员就只需要关注服务器端的开发技术,而不必再关心客户端技术!

2. 响应正文

在控制器的处理请求的方法之前添加@ResponseBody即可表示响应正文,当处理请求的方法的返回值是String类型时,返回的字符串将直接响应给客户端,例如:

@Controller
public class HelloController {
    
    
	
	@RequestMapping("hello.do")
	@ResponseBody
	public String showHello() {
    
    
		System.out.println("HelloController.showHello()");
		return "Hello, ResponseBody!";
	}

}

则客户端发出请求后,得到的响应结果就只有以上字符串中的20个字节的数据!

从响应头(Response Headers)中可以看到,此次响应时:

Content-Type: text/html;charset=ISO-8859-1

所以,默认情况下,是不支持中文的!

3. 响应正文的格式

如果客户端发出请求,希望得到某个用户的信息,包括用户名、密码、年龄、手机号码、电子邮箱,则服务器端响应时,只能响应1个字符串,不便于直接响应这5项目数据,例如响应为:

"[email protected]"

很显然,这样的数据不便于从中获取到用户名或密码等某个属性的值!

所以,应该将这些数据使用某种特定的语法规则组织起来,例如,早期普遍使用XML语法来组织这样的数据:

<user>
	<username>Mike</username>
	<password>1234</password>
	<age>25</age>
	<phone>13800138001</phone>
	<email>[email protected]</email>
</user>

则客户端收到以上格式的数据后,使用XML解析技术,就可以得到其中的每一个数据!

目前比较推荐使用的是JSON格式的数据,例如:

{
    
    
	"username":"Mike",
	"password":"1234",
	"age":25,
	"phone":"13800138001",
	"email":"[email protected]"
}

4. JSON数据格式

JSON(JavaScript Object Notation, JS对象简谱) 是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。

JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。

关于JSON数据的语法规则:

  • 整个JSON数据是一个对象,需要使用大括号{}框住;
  • 每个对象中可以有若干个属性的配置,各属性的配置之间使用逗号,分隔;
  • 属性名与属性值之间使用冒号:分隔;
  • 属性名是字符串格式的,使用双引号""框住;
  • 如果属性值是数值或布尔值,则直接写;如果属性值是字符串,则需要使用双引号""框住;如果是数组,则需要使用中括号[]框住,数组的各元素值之间使用逗号,分隔;如果是对象,则需要使用大括号{}框住;
{
    
    
	"username":"Mike",
	"password":"1234",
	"age":25,
	"phone":"13800138001",
	"email":"[email protected]",
	"skills":["Java", "HTML", "JavaScript"],
	"department":{
    
    
		"id":3,
		"name":"RD"
	}
}

JSON是JavaScript中的一种对象格式,可以直接从该对象中获取某个属性的值!例如:

console.log(json.username);
console.log(json.skills.length);
for(let i = 0; i < json.skills.length; i++) {
    
    
	console.log(json.skills[i]);
}
console.log(json.department.id);
console.log(json.department.name);

所以,使用JSON相对于使用XML来说,数据量可能更小,解析也会更加方便!

通常,JSON数据是从服务器端响应给客户端的,经过网络传输后,客户端收到的将是一个符合JSON语法的字符串,而并不是一个JSON对象!可以使用JSON.parse(str)函数将字符串转换为JSON对象:

let json = JSON.parse(jsonString);

5. 服务器端响应JSON数据

首先,在服务器端定义一个可以封装JSON数据中各属性的类:

public class User {
    
    

	private String username;
	private String password;
	private Integer age;
	private String phone;
	private String email;
	// SET/GET/toString

}

然后,在设计处理请求的方法时,返回值类型就使用以上创建的类型,并在方法体中确定要返回的数据中各属性的值:

@RequestMapping("info.do")
@ResponseBody
public User showInfo() {
    
    
	System.out.println("HelloController.showInfo()");
	User user = new User();
	user.setUsername("Mike");
	user.setPassword("1234");
	user.setAge(25);
	user.setPhone("13800138001");
	user.setEmail("[email protected]");
	return user;
}

如果需要将以上对象返回为JSON格式的数据,需要添加jackson-databind依赖:

<!-- Jackson依赖 -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.7</version>
</dependency>

另外,还需要在Spring的配置文件中添加注解驱动的配置:

<!-- 注解驱动 -->
<mvc:annotation-driven />

当处理请求的方法添加了@ResponseBody后,表示该方法将响应正文,SpringMVC框架是使用了一系列的**转换器(Converter)**对返回的对象进行处理,例如,当返回值类型是String时,SpringMVC框架会就自动使用StringHttpMessageConverter来处理的,许多常用的类型,都有对应的转换器,SpringMVC都会自动使用,如果方法的返回值类型是SpringMVC框架没有约定的类型,就会自动使用Jackson框架中的转换器,而Jackson框架中的转换器的做法就是将返回的对象转换为JSON格式,另外,可以直观的看到的还有Jackson框架会将响应头(Response Headers)中的Content-Type设置为application/json;charset=utf-8,所以,响应的JSON数据中是可以正常使用中文的!

小结:如果希望处理请求的方法能响应一段JSON数据,需要添加Jackson依赖,需要配置注解驱动,然后,处理请求的方法之前需要添加@ResponseBody注解,并且将方法的返回值声明为某种自定义的数据类型即可!

6. AJAX

Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。

Ajax = 异步JavaScript和XML或者是HTML(标准通用标记语言的子集)。

Ajax是一种用于创建快速动态网页的技术。

Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

通过在后台(子线程来运行,表面不可见)与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

首先,下载jQuery文件的压缩包,解压出其中的jquery-3.4.1.min.js文件,将该文件放到项目的webapp下。

然后,在login.html登录页面中引用该文件:

<script type="text/javascript" src="jquery-3.4.1.min.js"></script>

由于希望点击“登录”按钮后需要发出异常请求并处理,而不再是传统的表单提交,所以,需要将“登录”按钮的类型从submit改为button!而普通的button点击是没有效果的,所以,需要添加点击事件:

<input onclick="login()" type="button" value="登录" />

并且,声明对应的JavaScript函数:

<script type="text/javascript">
function login() {
      
      
	
}
</script>

在处理过程中,调用jQuery中的$.ajax()函数即可发出异常请求,并处理结果:

function login() {
    
    
	// $.ajax()函数的参数是一个JSON对象
	// 需要配置的属性有:
	// url:将请求提交到哪里去
	// data:请求参数,可以通过 $("#表单id").serialize() 获得
	// type:请求类型
	// dataType:服务器响应的数据类型,取值为xml/json/text之一,取决于服务器响应时,响应头的Content-Type
	// success:HTTP响应码是200时的回调函数,函数的参数值就是服务器响应的数据
	$.ajax({
    
    
		"url":"login.do",
		"data":$("#form-login").serialize(),
		"type":"post",
		"dataType":"json",
		"success":function(result) {
    
    
			if (result.state == 1) {
    
    
				alert("登录成功!");
			} else if (result.state == 2) {
    
    
				alert("登录失败!用户名错误!");
			} else {
    
    
				alert("登录失败!密码错误!");
			}
		}
	});
}

------------------------------

附1:关于Tomcat启动失败的解决方案

  1. 如果弹出的错误提示框中显示了8009等端口字样,则表示端口被占用,大多是因为之前已经启动了Tomcat,但是没有正常关闭,Tomcat仍处理运行状态,所以持续占用着相关端口,再次尝试启动Tomcat就会报错,所以,可以尝试关闭此前已经启动的Tomcat,如果没有界面可以操作,则尝试执行Tomcat安装目录下的bin目录下的shutdown.bat/shutdown.sh文件,或尝试结束占用相关端口的进程,实在是搞不定的话,还可以重启电脑;

  2. 如果弹出的错误提示框中没有明显的有价值的信息,先将项目Clean,并将Tomcat也Clean,然后再尝试启动;

  3. 如果问题仍存在,则需要观察Eclipse的Console的输出内容,如果提示了ClassNotFoundExceptionNoClassDefFoundError,表示找不到某个类或接口,则观察后续的提示信息指的是哪个类或接口,并修复,例如提示的类是Spring框架中的类,则需要重新下载相关的jar包,如果是自己的某个类,则检查类的全名是否拼写错误;

  4. 如果不符合以上问题,观察错误信息中是否存在ZipException(通常是大量的LifeCycleException中仅包含1个ZipException,需要仔细看),则是某个jar包损坏导致的,至于是哪个jar包不一定看得出来;

  5. 如果仍无法解决问题,可以尝试在Eclipse的Servers面板中把当前的Tomcat删除,并在项目管理面板中将名为Servers的项目删除,然后,在Servers面板中重新添加Tomcat(添加的就是原来的Tomcat即可);

  6. 如果仍无法解决问题,使用以上步骤再次删除Tomcat,然后,重新添加时,添加另一个Tomcat,甚至使用不同版本的Tomcat。

猜你喜欢

转载自blog.csdn.net/Kevinblant/article/details/121004492
今日推荐