发表于: 2020-12-12 23:20:39

1 1312


今天完成的事情:


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<StringObject> get(@PathVariable Integer id) {
//判断学生是否存在
Student student = studentService.selectById(id);
if (null == student) {
System.out.println("况博凯");
return Restful.set(404messageSource.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
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <country> 
  3.  <name>中国</name
  4.  <province> 
  5.  <name>黑龙江</name
  6.  <citys> 
  7.  <city>哈尔滨</city> 
  8.  <city>大庆</city> 
  9.  </citys> 
  10.  </province> 
  11.  <province> 
  12.  <name>广东</name
  13.  <citys> 
  14.  <city>广州</city> 
  15.  <city>深圳</city> 
  16.  <city>珠海</city> 
  17.  </citys> 
  18.  </province> 
  19.  <province> 
  20.  <name>台湾</name
  21.  <citys> 
  22.  <city>台北</city> 
  23.  <city>高雄</city> 
  24.  </citys> 
  25.  </province> 
  26.  <province> 
  27.  <name>新疆</name
  28.  <citys> 
  29.  <city>乌鲁木齐</city> 
  30.  </citys> 
  31.  </province> 
  32. </country> 
JSON Demo
  1.  "name""中国", 
  2.  "province": [  {  "name""黑龙江",  "citys": {  "city": [  "哈尔滨",  "大庆"  ]  }  },  {  "name""广东",  "citys": {  "city": [  "广州",  "深圳",  "珠海"   ]  }  },  {  "name""台湾"
  3.  "citys": {  "city": [  "台北",  "高雄"  ]  }  },  {  "name""新疆",  "citys": {  "city": [  "乌鲁木齐"  ]  }  }  ] 
===================================================



返回列表 返回列表
评论

    分享到