今天完成的事情:
15.不用使用JSON Tag-lib,直接用Spring 返回JSON对象,对比两种实现方式的差别和应用场景
熟悉spring-mvc的各种注解,了解servlet,servlet容器,对比jsp js json html xml 的区别
明天计划的事情:
16.Post时,对比用Http Body接收参数,用param接收参数的区别,分别描述两种方式的使用场景
17.用Spring messageSource 配置错误信息,在接口处做校验,根据错误的类型返回对应的错误信息
遇到的问题:
遗忘的太快了,由于之前是参考师兄的代码写的spring-mvc.有很多都不太熟悉,重新在来吧
收获:
不用使用JSON Tag-lib,直接用Spring 返回JSON对象,对比两种实现方式的差别和应用场景
有点忘记JSON Tag-lib的作用了,先去了解JSON Tag-lib返回数据是怎么样的,在来了解Spring 返回JSON对象是什么样子的。
JSON Tag-lib展示
json-taglib 是一个 jsp 标签库,作用就是把 jsp 文件变成 json 数据返回,格式可以自定义,数据可以自己任意编撰,只要符合 json 的格式都行。
这是jsp文件
使用postman测试返回数据,jsp文件变成 json 数据了:
=========
Spring 返回JSON对象的样子
这个就是使用@ResponseBody .@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
@RequestMapping(value = "/GETStudent/{id}", method = RequestMethod.GET)
public @ResponseBody
Map<String, Object> get(@PathVariable Integer id) {
//判断学生是否存在
Student student = studentService.selectById(id);
if (null == student) {
System.out.println("况博凯");
return Restful.set(404, messageSource.getMessage("id.null", null, null));
} else {
System.out.println("魏思静");
return Restful.set(200, "查找学生成功", student);
}
}
对比:
使用JSON Tag-lib比较麻烦,需要写jsp文件和使用JSON Tag-lib标签,使用spring直接返回json比较方便,使用@Resposebody直接可以给页面传入json数据.
=================================================
了解springmvc注解的各个作用
1. @Controller
@Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点:
1.不需要继承任何类, 也不需要实现任何接口
2.可以处理多个请求 这个指的是 GET,POST,PUT,DELETE请求吧
3.可以使用Servlet的相关特性 Servlet?小服务程序
spring自动扫描所有基于注解的类, 并将其注册为spring的bean, DispatcherServlet(前端控制器,是springmvc的核心组件)自动扫描注解为@Controller的类, 查找其中使用了@RequestMapping的方法, 这些方法是真正处理请求方法.
<!-- 扫描包路径com.lizj.controller下的所有类, 将带有注解的类注册到spring容器中 --><context:component-scan base-package="com.kbk.controller" />
<!-- 视图解释器 -->
<!-- 配置的视图解析器为InternalResourceViewResolver, 并为其添加了前缀prefix和后缀suffix属性 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
2. @RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上时,可以设置指定的参数,目的是让方法返回需要的参数,也作为一个标识,让spring看见。
用于方法上
// value: 指定请求的实际地址, 比如 /action/info之类。
// method: 指定请求的method类型, GET、POST、PUT、DELETE等
// consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/xml;
// produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
// params: 指定request中必须包含某些参数值是,才让该方法处理
// headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
例子:
3. @RequestParam
注解用于将指定的请求参数赋值给方法的参数.
请求处理的方法的参数的类型为Java基本类型和String.
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(@RequestParam("name") String name,
@RequestParam("author") String author) {
}
当方法参数没有用@RequestParam修饰时, 那么会默认绑定同名的参数.
这个没有用过,简单的看了一下
4. @PathVariable 5. @RequestHeader 6. @CookieValue 7. @SessionAttributes 8. @ModelAttribute 这些都没有用到过,就看一遍,碰到之后再来细看
9. @RequestBody 和 @ResponseBody
9.1 @RequestBody
用于读取request请求的body部分的数据(浏览器传输过来的),解析后,把相应的数据绑定到请求处理方法的参数上
前台页面使用GET或POST请求提交数据时, 数据编码格式会由请求头的ContentType来指定, 可分为以下几种情况:
application/x-www-form-urlencoded, 此时可以使用@RequestParam, @ModelAttribute来处理参数, 也可以使用@RequestBody.
multipart/form-data, 此时不能使用@RequestBody处理.
application/json或application/xml, 只能使用@RequestBody处理. 目前只用过这种格式的
9.2 @ResponseBody
@ResponseBody注解用于将Controller的请求处理方法返回的数据对象, 转换为指定格式后, 写入到response对象的的body数据区.
告诉spring-mvc框架 不进行视图跳转(不用跳到jsp去) 直接进行数据响应(直接返回当前数据)
==============================================
了解Servlet(参考网址:https://www.runoob.com/servlet/servlet-life-cycle.html)
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用Servlet,可以讲网页表单的用户输入,传给数据库之后返回数据呈现
Servlet 依赖jar包
<!--servlet web-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Servlet 和 Servlet容器(也叫Servlet)(参考网址:https://www.cnblogs.com/rickiyang/p/12764615.html)
Java web开发中为啥要有Servlet呢?是否可以不要
web开发的本质是什么?客户端和服务端交换数据。
这个过程有哪些?
1.建立连接,传输数据,关闭连接,你肯定知道这些步骤不是你所开发的web服务去处理的,而是tomcat容器帮你做了这些事情。
拿到请求行之后去找对应的 url 路由(这个意思是:根据请求的URL(GET,POST等等),来找到相应的映射函数(方法),然后执行该函数,并将函数的返回值发送给客户端),这一部分是谁做的呢? SpringMVC工程中的 web.xml文件这么一段配置:
<!--配置spring-mvc的前端控制器-->
<servlet>
<servlet-name>springmvc1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置处理适配器地址,交给springmvc.xml分配处理器-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<!--打开处理器-Controller-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置servlet映射器-->
<servlet-mapping>
<servlet-name>springmvc1</servlet-name>
<!--设置为处理所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring的核心就是一个 Servlet,它拦截了所有的请求,将请求交给 DispatcherServlet 去处理。
Servlet 到底是什么,它就是一段处理 web 请求的逻辑。
DispatcherServlet,它是 Spring 中定义的一个 Servlet,实现了 Servlet 接口,本质也是一个 Servlet。只是它是 HttpServlet 的继承者,主要处理 http 请求。所以 Spring 程序本质是就是一个 Servlet。SpringMVC 帮你做了本该你去实现的逻辑
再来看 Java 中的 Servlet,它只是一个接口:
package javax.servlet;
import java.io.IOException;
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
Servlet 接口规定请求从容器到达 web 服务端的规范,最重要的三个步骤是:
init():初始化请求的时候要做什么;
service():拿到请求的时候要做什么;
destory():处理完请求销毁的时候要做什么。
这也是Servlet 的生命周期:定义为从创建直到毁灭的整个过程
所有实现 Servlet 的实现方都是在这个规范的基础上进行开发。那么 Servlet 中的数据是从哪里来的呢?答案就是 Servlet 容器。容器才是真正与客户端打交道的那一方。Servlet容器只有一个,而 Servlet 可以有多个。
常见的Servlet容器Tomcat,它监听了客户端的请求端口,根据请求行信息确定将请求交给哪个Servlet 处理,找到处理的Servlet之后,调用该Servlet的 service() 方法,处理完毕将对应的处理结果包装成ServletResponse 对象返回给客户端。
Servlet 容器
Servlet 只是一个处理请求的应用程序,光有Servlet是无法运行起来的,需要有一个 main 方法去调用你的这段 Servlet 程序才行。所以这里出现了Servlet 容器的概念。Servlet容器的主要作用是:
1.建立连接;
2.调用Servlet处理请求;
3.响应请求给客户端;
4.释放连接;
先spring-mvc只负责 :2.调用Servlet处理请求;(因为我们需要对不同的业务逻辑自己去实现不同的处理),1,3,4都交给Servlet 容器去做。
总结:Servlet是什么?处理web请求的逻辑。Servlet容器的作用是什么?把共有行为(建立连接,响应请求,释放连接)拿出来交给Servlet容器去做,让程序员专注于实现不同的业务逻辑。
=================================================
jsp js json html xml 有什么区别,老是搞混
首先在spring-mvc中碰到的是jsp,json,xml。
之前对比过jsp和html的区别,html是静态的,jsp是动态的。静态和动态的区别是动态页面可以进行交互,你点一下会有反应。html可以直接打开,jsp不能直接打开,需要先转译成一个Servlet文件(为了传输到浏览器?),然后在编译成class文件。当用户访问JSP时就执行了class文件.
JS(javaScript) 是一种脚本语言,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。。可以以<script> code </script>的形式混合在HTML页面中,使页面产生动态效果。
json:之前在postman中使用Body的json格式传输到spring-mvc中。知道json语法和js相同,所以无需解析器,可直接用 JSON 数据来生成原生的 JavaScript 对象。spring-mvc也可以直接返回json到浏览器页面进行展示。
提取观点:1。它是前端和后台交互用的。2。它是键值对的.3.它只是一个字符串,它只是一个有规则的字符串。(重点)
而且json常常和xml进行比较(参考网址:https://www.runoob.com/json/json-vs-xml.html)
但我关于xml的印象都是mybatis的配置,spring的配置,不知道为什么用json和xml进行比较。
是因为他们都用与接受web服务端的数据吗?
XML Demo
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<citys>
<city>哈尔滨</city>
<city>大庆</city>
</citys>
</province>
<province>
<name>广东</name>
<citys>
<city>广州</city>
<city>深圳</city>
<city>珠海</city>
</citys>
</province>
<province>
<name>台湾</name>
<citys>
<city>台北</city>
<city>高雄</city>
</citys>
</province>
<province>
<name>新疆</name>
<citys>
<city>乌鲁木齐</city>
</citys>
</province>
</country>
JSON Demo
{
"name": "中国",
"province": [ { "name": "黑龙江", "citys": { "city": [ "哈尔滨", "大庆" ] } }, { "name": "广东", "citys": { "city": [ "广州", "深圳", "珠海" ] } }, { "name": "台湾",
"citys": { "city": [ "台北", "高雄" ] } }, { "name": "新疆", "citys": { "city": [ "乌鲁木齐" ] } } ]
}
===================================================
评论