发表于: 2019-10-18 23:37:32
1 1707
今天完成的事:
1、完成参数校验、国际化配置。
参考网址:
首先建立各个语言配置文件,这里只选了中文、英文,还有一个默认的中文配置文件,如果对应的语言配置文件没有找到,就会执行默认的配置文件语言。
右击resources资源文件,选择new->Resource Bundle,可以添加base name,如language,再点击右侧“+”,添加相应的语言设置。这里因为我是先手动创建的配置文件,所以在左侧本地的位置会显示创建过的语言设置,可以直接点击“add all”添加到右侧,用于再次生成相应语言的配置文件,但是基础命名base name不能重复。
这里有问题,中文处应该是zh_CN,我手动设置时写错误了。
就可以自动创建配置文件了,不需要手动一个一个创建。
下图是修改后,我创建的配置文件。
进行设置后效果如图,但是没有找到完整的实例,都是这个那个抄点抄点,代码很乱。。
原本的提交按钮上的文字是直接value赋值的,这里只能选择是写中文还是英文,单独只有这里不根据语言变化感觉太别扭,于是就试着把<fmt>标签用在value里面,没想到竟然可行。。
根据超链接的选择虽然可以进行语言的变化,但是如果在输入错误信息后,切换语言的话,就会出现下列情况,除非像name一样没有做非空校验判断。。这里暂时留着,先进行任务。
使用postman测试,会返回如下的错误。
详细代码:
在昨天参数校验的基础上进行修改,红色部分为修改部分。文件也只是增加了几个语言的配置文件,如上文。
springmvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 使用false,表示所有注解的类都不扫描 -->
<context:component-scan base-package="com.ssm" use-default-filters="false">
<!--配置哪些注解进行扫描-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:annotation-config/>
<!--
<mvc:annotation-driven />
-->
<mvc:default-servlet-handler />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器,使用hibernate校验器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件,国际化 -->
<!--
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名,使用basenames,不用加后缀名,此处需注意name不是basename-->
<property name="basenames">
<list>
<value>classpath:ValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="UTF-8"/>
<!-- jsp页面编码格式 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
<!-- 语言区域里没有找到对应的国际化文件时,默认使用ValidationMessages.properties文件-->
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
<!-- 国际化配置 -->
<!-- 拦截器,主要用于获取请求中的locale信息,将其转为Locale对像,获取LocaleResolver对象-->
<mvc:interceptors>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
<!-- 配置SessionLocaleResolver用于将Locale对象存储于Session中供后续使用 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"></bean>
<!-- 将校验器注入处理适配器中 -->
<mvc:annotation-driven conversion-service="conversionService" validator="validator"></mvc:annotation-driven>
</beans>
controller类(与昨天一样):
//在需要校验的pojo前,添加@Validated,在需要校验的pojo后添加BindingResult bindingResult接收校验出错信息
//注意!!@Validated和BindingResult bindingResult 是配对出现的,并且在形参里的顺序是固定的(一前一后)
@RequestMapping("/addCategory")
public ModelAndView addCategory(@Validated @ModelAttribute("category") Category category,BindingResult bindingResult){
ModelAndView mav = new ModelAndView();
//获取校验的错误信息
if(bindingResult.hasErrors()){
mav.setViewName("addGo");
//出错则重新至添加页面
return mav;
}
//调用service添加
categoryService.add(category);
mav.setViewName("redirect:/listCategory");
return mav;
}
添加数据的jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%--
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
--%>
<title>Insert title here</title>
</head>
<body>
<sf:form action="/addCategory" method="post" modelAttribute="category">
<table>
<TR>
<td>
<fmt:message key="springmvc.name"/>:
</td>
<td>
<INPUT name="name" value="${category.name}">
</td>
<td>
<sf:errors path="name" cssStyle="color:red"></sf:errors>
</td>
</TR>
<TR>
<td>
<fmt:message key="springmvc.qq"/>:
</td>
<td>
<INPUT name="qq" value="${category.qq}">
</td>
<td>
<sf:errors path="qq" cssStyle="color:red"></sf:errors>
</td>
</TR>
<TR>
<td>
<fmt:message key="springmvc.school"/>:
</td>
<td>
<INPUT name="school" value="${category.school}">
</td>
<td>
<sf:errors path="school" cssStyle="color:red"></sf:errors>
</td>
</TR>
<tr>
<td>
<fmt:message key="springmvc.language"/>:
</td>
<td>
<a href="?locale=zh_CN">中文</a>
<a href="?locale=en_US">English</a><br/>
</td>
<td>
<fmt:message key="springmvc.now.language"/>:${pageContext.response.locale}
</td>
</tr>
<tr>
<td>
<%--
<INPUT input type="submit" value="添加">
--%>
<INPUT input type="submit" value="<fmt:message key="springmvc.submit"/>">
</td>
</tr>
</table>
</sf:form>
</body>
</html>
语言配置文件:
这里读取的都是中文配置文件,不是默认配置文件。
2、安装、配置Nginx。
nginx的特点就是反向代理和负载均衡。
反向代理就是客户端发出请求后,由反向代理服务器分配给各个服务器,但是客户端并不知道是分给哪个服务器,进行了服务器的隐藏。
正向代理就是客户端明确知道访问的是哪个服务器,但是服务器并不知道哪个客户端访问的,隐藏了客户端。
所谓负载均衡就是客户端发出的请求过多时,按照一定的规则分配给不同的服务器,减轻单个服务器的压力。
(1)下载地址、版本如下。
启动、关闭服务器命令如下,根据下面的经验,最好使用nginx.exe开启nginx服务。
nginx访问成功。
开启、关闭服务都可以执行,但是开启后cmd就没反应了,输入不了任何东西。。
只能关了cmd再次打开,结果关闭服务报错,百度后得知是权限不够,之前是用的管理员权限,这里再次打开没有用管理员权限。。
(2)修改本地host文件。
本地的host文件可以指定localhost的IP名称,这里修改为zhangheng,在访问时,就可以替代之前的localhost。
可以访问Tomcat的8080端口。
但是不知道为什么nginx又打开了。。关闭还报错。。
使用nginx-c指定nginx.conf文件位置。
又要重新打开cmd执行关闭命令,成功关闭。
(3)配置nginx,反向代理。
在安装目录的conf文件夹中的nginx.conf文件中,其中的127.0.0.1可以改成localhost。修改后需要重启nginx。
在浏览器输入域名,nginx会在nginx.conf中查找server_name对应的域名所在的server中的location跳转到proxy_pass指定的IP和端口。就可以隐藏IP和端口号,实现反向代理。
这里使用指定的域名localhost访问和访问8080端口是相同的访问效果。localhost就是指定的替代IP地址的域名。
想把server_name设置成其他单词,设置后,关闭nginx,结果发现怎么也关不了。。原来nginx进程启动时,会附带一个守护进程,用于保护正式进程不被异常终止,一旦发现终止,会自动重启。。原来还有守护神,是个大boss。。
查找方法,直接杀死nginx的所有进程。
但是直接访问zhangheng无法访问,还是能访问localhost,询问师兄。
才知道需要在host文件中默认的127.0.0.1用localhost代替,所以在nginx.conf中的server_name如果想换成别的单词,比如zhangheng,就需要在host文件中指定zhangheng替代127.0.0.1。如下,就能访问了。其实效果和localhost是一样的,都是隐藏真实IP和端口。
(4)简单查看负载均衡。
在nginx.conf文件中的http节点中手动添加upstream,里面加上配置的多个Tomcat的IP,就可以在访问本地host指定的域名(如localhost)时,进行负载均衡。
nginx默认的负载均衡策略是加权轮询,就是使用weight=1来给地址添加权重,权重越高,nginx会优先分配。
明天计划的事:
提交任务二、查看深度思考。
遇到的问题:
1、根据超链接的选择虽然可以进行语言的变化,但是如果在输入错误信息后,切换语言的话,就会出现下列情况,除非像name一样没有做非空校验判断。。
2、nginx使用cmd操作老是执行命令后,cmd就不动了,无法输入命令,只能关闭再开启cmd,感觉好麻烦,也不知道是什么原因。。
收获:
1、完成参数校验、国际化配置。
参考网址:
2、安装、配置Nginx,进行反向代理操作,简单了解负载均衡。
反向代理就是客户端发出请求后,由反向代理服务器分配给各个服务器,但是客户端并不知道是分给哪个服务器,进行了服务器的隐藏。
所谓负载均衡就是客户端发出的请求过多时,按照一定的规则分配给不同的服务器,减轻单个服务器的压力。
评论