java基础巩固18

使用Spring MVC

(1)Java Web的基础:Servlet容器,以及标准的Servlet组件:
Servlet:能处理HTTP请求并且将HTTP响应返回。
JSP:一种嵌套Java代码的HTML,将被编辑为Servlet;
Filter:能过滤指定的URL以实现拦截功能;
Listener:监听指定的事件,如ServletContext、HttpSession的创建和销毁。
此外,Servlet容器为每个Web应用程序自动创建一个唯一的ServletContext实例,这个实例就代表了Web应用程序本身。
(2)使用Spring MVC时,整个Web应用程序按照如下顺序启动:
一、启动Tomcat服务器
二、Tomcat读取web.xml并初始化DispatcherServlet
三、DispatcherServlet创建IoC容器并自动注册到ServletContext中。
启动后,浏览器发出的HTTP请求全部由DispatcherServlet接收,并且根据配置转发到指定Controller的指定方法处理。

使用REST

(1)使用Spring MVC开发Web应用程序的主要工作就是编写Controller逻辑,在Web应用中就,除了需要使用MVC给用户显示页面外,还有一类API接口就,我们称之为REST,通常输入输出都是JSON,便于第三方调用或者使用页面JavaScript与之交互。直接在Controller中处理JSON是可以的,因为Spring MVC的@GetMapping和@PostMapping都支持指定输入和输出的格式。如果我们想接收JSON,输出JSON,那么可以这样写:
@PostMapping(value = “/rest”,
consumes = “application/json;charset=UTF-8”,
produces = “application/json;charset=UTF-8”)
@ResponseBody
public String rest(@RequestBody User user) {
return “{“restSupport”:true}”;
}

对应的Maven工程需要加入Jackson这个依赖:com.fasterxml.jackson.core:jackson-databind:2.11.0,注意到@PostMapping使用consumes声明能接受的类型,使用produces声明输出的类型,并且额外加了@ResponseBody表示返回的String无需额外处理,直接作为输出内容写入HttpServletResponse。输入的JSON则根据注解直接被反序列化为User这个JavaBean。

(2)直接用Spring的Controller配合一大堆注解写REST太麻烦了,因此,Spring还额外提供了一个@RestController注解,使用@RestController替代@Controller后,每个方法自动变成API接口方法。编写REST接口只需要定义@RestController,然后每个方法都是一个API接口,输入和输出只要能被Jackson序列化或者反序列化为JSON就没有问题。
(3)注意观察上述JSON的输出,User能被正确地序列化为JSON,但暴露了password属性,这是我们不期望的。要避免输出password属性,可以把User复制到另一个UserBean对象,该对象只持有必要的属性,但这样做比较繁琐。另一种简单的方法是直接在User的password属性定义处加上@JsonIgnore表示完全忽略该属性。但是这样一来,如果写一个register(User user)方法,那么该方法的User对象也拿不到注册时用户传入的密码了。如果要允许输入password,但不允许输出password,即在JSON序列化和反序列化时,允许写属性,禁用读属性,可以更精细地控制如下:
@JsonProperty(access= Access。WRITE_ONLY)
public String getPassword() {
return password;
}
同样的,可以使用@JsonProperty(access = Access.READ_ONLY)允许输出,不允许输入。

集成Filter

(1)在Spring MVC中,DispatcherServlet(DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。)只需要固定到web.xml中,剩下的工作主要是专注于编写Controller。但是,在Servlet规范中,我么那还可以使用Filter。如果要在Spring MVC中使用Filter,应该怎么做?
(2)在Web应用中,如果注册时输入中文会导致乱码,因为Servlet默认按照非UTF-8编码读取参数。为了修复这个问题,我们可以简单地使用一个EncodingFilter,在全局范围类给HttpServletRequest和HttpServletResponse强制设置为UTF-8编码。可以自己编写一个EncodingFilter,也可以直接使用Spring MVC自带的一个CharacterEncodingFilter。配置Filter时,只需在web.xml中声明即可:
在这里插入图片描述
因为这种Filter和我们业务关系不大,注意到CharacterEncodingFilter其实和Spring的IoC容器没有任何关系,两者均互不知晓对方的存在,因此,配置这种Filter十分简单。
(3)如果允许用户使用Basic模式进行用户验证,即在HTTP请求中添加头Authorization: Basic email:password,这个需求如何实现?
编写一个AuthFilter是最简单的实现方式:
在这里插入图片描述
现在问题来了:在Spring中创建的这个AuthFilter是一个普通Bean,Servlet容器并不知道,所以它不会起作用,如果我么你再web.xml中声明这个AythFilter,主要AuthFilter的实例将由Servlet容器而不是Spring容器初始化,因此,@Autowire根部不生效,用于登录的成员变量永远是null。所以,得通过一种方式,让Servlet容器实例化的Filter,间接引用Spring容器实例化的AuthFilter。Spring MVC提供了一个DelegatingFilterProxy,专门来干这个事情。
(4)Servlet容器从web.xml中读取配置,实例化DelegatingFilterProxy,注意命名是authFilter;Spring容器通过扫描@Component实例化AuthFilter。当DelegatingFilterProxy生效后,它会自动查找在ServletContext上的Spring容器,再试图从容器中查找名为authFilter的Bean,也就是我们用@Component声明的AuthFilter。DelegatingFilterProxy将请求代理给AuthFilter,核心代码如下:
在这里插入图片描述
这就是一个代理模式的简单应用。我们画个图表示它们之间的引用关系如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值