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项目数据,例如响应为:
"Mike12342513800138001mike@163.com"
很显然,这样的数据不便于从中获取到用户名或密码等某个属性的值!
所以,应该将这些数据使用某种特定的语法规则组织起来,例如,早期普遍使用XML语法来组织这样的数据:
<user>
<username>Mike</username>
<password>1234</password>
<age>25</age>
<phone>13800138001</phone>
<email>mike@163.com</email>
</user>
则客户端收到以上格式的数据后,使用XML解析技术,就可以得到其中的每一个数据!
目前比较推荐使用的是JSON格式的数据,例如:
{
"username":"Mike",
"password":"1234",
"age":25,
"phone":"13800138001",
"email":"mike@163.com"
}
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":"mike@163.com",
"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;
}
然后,在设计处理请求的方法时,返回值类型就使用以上创建的类型,并在方法体中确定要返回的数据中各属性的值:
@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("mike@163.com");
return user;
}
如果需要将以上对象返回为JSON格式的数据,需要添加jackson-databind 依赖:
<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({
"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启动失败的解决方案
-
如果弹出的错误提示框中显示了8009等端口字样,则表示端口被占用,大多是因为之前已经启动了Tomcat,但是没有正常关闭,Tomcat仍处理运行状态,所以持续占用着相关端口,再次尝试启动Tomcat就会报错,所以,可以尝试关闭此前已经启动的Tomcat,如果没有界面可以操作,则尝试执行Tomcat安装目录下的bin目录下的shutdown.bat/shutdown.sh文件,或尝试结束占用相关端口的进程,实在是搞不定的话,还可以重启电脑; -
如果弹出的错误提示框中没有明显的有价值的信息,先将项目Clean,并将Tomcat也Clean,然后再尝试启动; -
如果问题仍存在,则需要观察Eclipse的Console的输出内容,如果提示了ClassNotFoundException 或NoClassDefFoundError ,表示找不到某个类或接口,则观察后续的提示信息指的是哪个类或接口,并修复,例如提示的类是Spring框架中的类,则需要重新下载相关的jar包,如果是自己的某个类,则检查类的全名是否拼写错误; -
如果不符合以上问题,观察错误信息中是否存在ZipException (通常是大量的LifeCycleException 中仅包含1个ZipException ,需要仔细看),则是某个jar包损坏导致的,至于是哪个jar包不一定看得出来; -
如果仍无法解决问题,可以尝试在Eclipse的Servers面板中把当前的Tomcat删除,并在项目管理面板中将名为Servers的项目删除,然后,在Servers面板中重新添加Tomcat(添加的就是原来的Tomcat即可); -
如果仍无法解决问题,使用以上步骤再次删除Tomcat,然后,重新添加时,添加另一个Tomcat,甚至使用不同版本的Tomcat。
|