发表于: 2020-06-13 23:51:14

1 1671


今天完成的事情:


16.Post时,对比用Http Body接收参数,用param接收参数的区别,分别描述两种方式的使用场景。

post可以传递参数可以大致分成两种,一种是表单:在sevlet实现中mutipart/form-data和application/x-www-form-urlencoded会被特殊处理,请求参数将被放置于request.paramter,解析成map。第二种,已application/json,参数是存放在json中的,参数必须要用@RequestBody才能解析出来。


@RequestBody

将post请求中内容转为一个整体对象。@RequestBody的解析有两个条件:

        1.POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);

        2.@RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean。所以Integer类型不能作为@RequestBody注解的参数类型


@RequestParam

这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。


总结,param不能接收json格式的数据,且只能通过表单接收数据。


17.用Spring messageSource 配置错误信息,在接口处做校验,根据错误的类型返回对应的错误信息


SpringMvc的过程中要拦截请求,校验数据主要有@valid和@validated两种校验框架:

其中:

@Valid是使用hibernate validation的时候使用

@Validated是使用spring Validator校验机制使用


Hibernate Validator常用注解

注解 释义

@Null 必须为null

@NotNull 不能为null

@AssertTrue 必须为true

@AssertFalse 必须为false

@Min 必须为数字,其值大于或等于指定的最小值

@Max 必须为数字,其值小于或等于指定的最大值

@DecimalMin 必须为数字,其值大于或等于指定的最小值

@DecimalMax 必须为数字,其值小于或等于指定的最大值

@Size 集合的长度

@Digits 必须为数字,其值必须再可接受的范围内

@Past 必须是过去的日期

@Future 必须是将来的日期

@Pattern 必须符合正则表达式

@Email 必须是邮箱格式

@Length 长度范围

@NotEmpty 不能为null,长度大于0

@Range 元素的大小范围

@NotBlank 不能为null,字符串长度大于0(限字符串)


首先使用hibernate validation校验,导入依赖:

<!--接口校验-->
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
 <groupId>javax.validation</groupId>
 <artifactId>validation-api</artifactId>
 <version>1.1.0.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>5.1.0.Final</version>
</dependency>


这里很容易出现版本问题。


applicationContext.xml中注入:

<!-- 校验器,配置validator -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
   <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
   <property name="validationMessageSource" ref="validationMessageSource"/>
</bean>

<!-- 配置validationMessageSource -->
<bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
   <!-- 指定校验信息的资源文件的基本文件名称,不包括后缀,后缀默认是properties -->
   <property name="basenames">
       <list>
           <value>Message</value>
       </list>
   </property>
   <!-- 指定文件的编码 -->
   <property name="fileEncodings" value="utf8"/>
   <!-- 对资源文件内容缓存的时间,单位秒 -->
   <property name="cacheSeconds" value="120"/>
</bean>


将validator注册到适配器中:

<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
   <property name="validator" ref="validator"/>
</bean>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
   <property name="webBindingInitializer" ref="customBinder">
   </property>
</bean>


在pojo中指定校验规则:


controller中对其校验绑定进行使用:

@RequestMapping("/SelectById")
public String SelectById(Long ID, Model model, @Validated Student student, BindingResult result){

if (ID==null && result.hasErrors()){
List<ObjectError>allErrors=result.getAllErrors();
       for (ObjectError objectError:allErrors) {
System.out.println(objectError.getDefaultMessage());
       }
model.addAttribute("errors",allErrors);
       return "error";
   }
model.addAttribute("student",studentService.SelectById(ID));
   return "SelectById";
}


JSP页面:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% String path=request.getContextPath();
   String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
<html>
<head>
   <title>错误页面</title>
</head>
<body>
<h1 style="text-align: center">错误信息界面</h1>
<c:if test="${errors!=null&& errors.size()>0}" >
<c:forEach items="${errors}" var="error">
${error.defaultMessage}<br/>
   </c:forEach>
</c:if>
<a href="<%=basePath%>/Student/GetAllStudent">返回用户界面</a>
</body>
</html>


测试:

测试成功!


卡了一天终于成功了,之前主要就是版本问题,再就是注册适配器那,使用下面这个会报错:

<mvc:annotation-driven  conversion-service="conversionService" validator="validator"/>



18.配置Nginx,配置域名指向Resin,本地配置Host,通过域名在浏览器,Postman等测试数据。


Niginx是什么?

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。


Niginx有什么用?

1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型

2、作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

3、作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。


Niginx有什么优势?

1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高。

2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。

3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。

4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源。

5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。

6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行。

7、Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。


使用Niginx:

下载之后解压:


直接运行nginx.exe


地址栏输入http://localhost:80


成功


为了避免端口占用,我将Nginx端口设为8010,这个可以再conf文件夹下Nginx.conf文件中更改


收获:

了解了param和body接收数据的使用场景,学会了springMVC的数据校验,初步了解Nginx。


明天计划的事情:

完成Nginx配置域名指向Resin,本地配置Host,通过域名在浏览器,Postman等测试数据。




返回列表 返回列表
评论

    分享到