1.SpringMVC中Controller处理response.setContentType()
2.spring国际化配置?
3.springMVC的配置问题 求大神来帮帮忙,谢谢啦!
SpringMVC中Controller处理response.setContentType()
处理response.setContentType()及header为"application/json;charset=utf-8"无效问题分析
在SpringMVC中,当使用Controller处理request并设置response.setContentType("application/json;charset=UTF-8")以输出中文时,发现结果仍然为乱码。此类问题的html直播平台源码异常现象通常源于源码内部的特殊处理,导致通过该方法设置的请求头编码无效。
SpringMVC通过RequestMappingHandlerAdapter处理注解定义的请求处理器方法。在该类中,invokeHandlerMethod()方法负责调用目标方法并处理返回值。当return value不为null时,会通过returnvalueHandlers进行处理,其中会调用MessageConverter将返回值转换为相应的报文格式。
HttpOutputMessage实例通常是ServletServerHttpResponse,它在写入数据的同时会设置response的header,包括content-type(根据RequestMapping的produces属性计算得出)。因此,在controller中设置content-type在请求方法带有返回值的情况下是无效的,会被消息转换器覆盖。
为解决此问题,有两种方法可考虑:
1. 方法一,利用produces属性:在RequestMapping中明确指定produces为"application/json;charset=UTF-8",这将直接影响到消息转换器对返回值的处理方式,确保输出内容按照指定编码格式。
2. 方法二,请求方法不带返回值:在Controller方法中,可以设计为不返回数据,而是通过直接在response对象上输出所需内容。这样,可以避免与消息转换器的冲突,确保输出内容按照预期编码格式显示。
spring国际化配置?
如何实现SpringMVCin国际化,动态设置默认语言
1.在spring配置文件中配置资源文件properties的位置及公共名,下列配置指定的properties文件处于src目录下的resources文件夹中,名字为message_info_*.properties。
beanid="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"
propertyname="basenames"
list
valueresources/message_info/value
/list
/property
propertyname="useCodeAsDefaultMessage"value="true"/!--
Setwhethertousethemessagecodeasdefaultmessageinsteadof
throwingaNoSuchMessageException.Usefulfordevelopment
anddebugging.--
/bean
2.在spring配置文件中配置基于session的处理,将提交上来的locale参数进行处理,下列代码默认加载的scintilla源码下载语言是中文简体拦咐。
beanid="localeResolver"class="org.springframework.web.servlet.in.SessionLocaleResolver"
propertyname="defaultLocale"value="zh_CN"/property
/bean
3.在spring配置文件中的controller内配置相应的拦截器。
beanid="className"
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"
propertyname="interceptors"
list
beanclass="org.springframework.web.servlet.in.LocaleChangeInterceptor"/
/list
/property
/bean
4.相应的properties文件内写入对应的语言,配置文件的语言信息以keyvalue的形式进行存储。
5.利用jstl的fmt标签库进行相应数据的国际化。
1)导入相应的fmt标签库%@taglibprefix="fmt"uri=""%
2)需要国肆衡羡际化处写入fmt:messagekey="title"/fmt:message标签,此处将显示相应properties文件中名为title的信息。
3)页面上写成三个连接用于控制国际化的转换
ahref="/CloudPortal/staff/goindex.do?locale=zh_CN"裂拍Chinese/a//message_info_zh_CN.properties
ahref="/CloudPortal/staff/goindex.do?locale=en_US"English/a//message_info_en_US.properties
ahref="/CloudPortal/staff/goindex.do?locale=zh_TW"Chinese(TW)/a//message_info_zh_TW.properties
locale内部固定的参数用于判断读取请求的配置文件。
-------------------------------------------------------------
分割线----------------by
zhang------------------------------------------------------------------------------------------------------
springmvc如何实现国际化
1.springmvc实现国际化有多种方式(自行百度)。
几种方式无非就是配置国际化方式和读取国际化资源文件从而实现国际化,下面本文介绍基于session的国际化配置,感觉配置比较方便快捷一些。
(1).首先配置配置国际化在spring-servlet.xml,即springmvc的配置文件中(xxx-servlet.xml)。
!--springmvc国际化配置(基于Session的国际化配置方式)--
beanid="localeResolver"
class="org.springframework.web.servlet.in.SessionLocaleResolver"
/bean
beanid="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
propertyname="fallbackToSystemLocale"
valuefalse/value
/property
propertyname="basename"value="/WEB-INF/in/resources/messages"/
/bean
(2)在WEB-INF文件夹下按照
[html]viewplaincopy
/WEB-INF/in/resources/messages
配置新建文件夹,在文件夹里面新建配置文件
messages_zh_CN.properties(中文国际化资源文件),messages.properties(英文国际化资源文件)国际化资源文件。
到此配置完毕。
注:springmvc的国际化必须要经过控制器Controller才能生效。
2.如何在jsp页面读取国际化
(1)引入spring:message/标签如:spring:messagekey=''user.manage.role/
或者
(2)引入fmt:message/标签例如fmt:messagekey='user.manage.role'/,其中user.manage,role在messages_zh_CN.properties中配置为:user.manage.role=\uD2\u,在messages.properties中配置为user.manage.role=Role,即可。
SpringBoot如何配置和引用国际化资源第一种将资源文件放在源码里面:
那么配置文件信息如下:
!--读取国际化资源文件==资源文件在包里面,路径写全包名--
beanid="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
propertyname="basenames"
list
valuecn/ddx/in/messages/value
/list
/property
/bean
第二种配置文件在WEB-INF下面自己创建的目录下面:
那么配置文件信息如下:
!--读取国际化资源乱信文件==资源文件在WEB-INF下面,可以配置多个--
beanid="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
propertyname="basenames"
list
value/WEB-INF/lang/messages/value
/list
/property
/bean
需要注意的是两者配置的class不同
配置文件路径中的“祥李messages”为资源文件名称中_en_US.properties的前面部分,可谨陪迟以自定义。
javaEEWeb项目Spring的国际化异常Nomessagefound
我也喊猛遇到这个问题了。现在已经解决
解决方法:
application.properties增没渗袜加配置:如枯激下:
login是你的文件的名字
#国际化配置
spring.messages.basename=in/login
#-1noexpried
spring.messages.cache-seconds=-1
spring.messages.encoding=UTF-8
SpringBoot国际化(jsp)原来的项目用的是jsp,改成html太麻烦,这里介绍一辩弊下jsp国际化的(如果仿灶物是html使用thymeleaf,它自带了的)备液:
1.项目路径如图:
2.相关依赖:
3.新增InConfig(设置默认语言)
4.新增LocaleResolver(修改local的值)文件
5.application.yml文件
6.新建messages.properties,messages_zh.properties,messages_en.properties个文件:
7.index.jsp
效果:
spring配置国际化porperties文件怎么取数据一般来说。我们会将一些配置的信息放在。properties文件中。
然后使用${ }将配置文件中的信息读取至搭卖spring的配置文件。
那么我们知腊逗如何在spring读取properties文件呢。
1.首先。我们要先在spring配置文件中。定义一个专门读取properties文件的好省源码出类.
例:
beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
propertyname="locations"
list
valueclasspath*:jdbc.properties/value
!--要是有多个配置文件,只需在这里继续添加即可--
/list
/property
/bean
这里为什么用locations(还有一个location)
是因为。一般来说。我们的项目里面。配置文件可能存在多个。
就算是只有一个。那将来新添加的话。只需在下面再加一个value标签即可。
而不必再重新改动太多。(当然。性能上是否有影响,这个以当前这种服务器的配置来说。是基科可以忽略不计的)。
然后我们就可以在jdbc.properties文件中填写具体的配置信息了。
!--配置C3P0数据源--
beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"
propertyname="driverClass"
value${ jdbc.driverClassName}/value
/property
propertyname="jdbcUrl"
value${ jdbc.url}/value
/property
propertyname="user"
value${ jdbc.username}/value
/property
propertyname="password"
value${ jdbc.password}/value
/property
/bean
jdbc.properties文件写的信息。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:/test
jdbc.username=root
jdbc.password=root
附加一个列子:
beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
propertyname="locations"
list
valuefile:/data/pc-config/passport.properties/value
valueclasspath:memcached.properties/value
/list
/property
/bean
classpath:是指的当前类文件的目录下。
file:在局仿window下是指的当前分区(比如你的项目是放在d盘,则是在d:/data/pc-config/passport.properties)
在linux下,则是当前路径下的文件/data/pc-config/passport.properties
springboot国际化(前后端分离情况)spring.messages.basename=messages/messages
其中ifelse部分可以省略,看前端传的情况,前端如果传乱态正送header中的Accept-Language是en,zh,ja这样的简写,就需要补全,如果前端传过来的就是en-US,zh-CN,这样的就不需要if,else转换。
当然也可以不用messageSource用ResourceBundle?:
messages.properties中的是默认的,如果语言取不到就取默认的。
messages_zh_CN.properties是中文的配哗悔置:
messages_en_US.properties是英文配置:
比如切换语言的多选框:
具体方法:
则jquery调用可以是这样:
其中headers:{ 'Accept-Language':localStorage.getItem('lang')||'en'},这个就是根据你切换的语言,传给服务端对应的语言,这样闭耐就做到前后端同步。
springMVC的配置问题 求大神来帮帮忙,谢谢啦!
Spring配置
人们经常会在一台以上的主机上配置一种Web应用程序。例如,在生产中,一个网站可能只有一个实例。源码乘法除法除了此实例外,开发人员可以在用于开发的机器上配置其他的(开发)实例。也可以在公司(机构)内部的本地开发服务器上维护其他应用程序装置,这将让您受益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料,并为需要为应用程序提供文件资料的人提供准入。
大家都知道,即使是最简单的场景,也需要安装、配置和维护三个实例。而对于位于不同地理位置的团队来说,要从事这样的项目便更加困难。对于任何不是特别简单的Web应用程序项目,都需要多名开发人员来安装项目装置和本地设置以及运行单元测试的装置等。
很多组织都将自己开发的产品作为Web应用程序。我们可以在很多产品中发现这种情况,例如电子商务系统、内容管理系统(CMS),以及博客发布平台等。这类产品可在多个服务器中进行部署。对于成功的多用途Web应用程序来说,他们的开发人员必须要保证他们的应用程序便于安装,并且能够与其他Web应用程序完美集成。经过上述讨论之后,我们应该明了,作为本文主题的应用程序配置是通用Web应用程序项目开发人员所需要解决的重要问题之一。
诸如CVS或Subversion之类的版本控制系统是开发组织使用的一种标准工具。这种工具代表了一些组织的中心源代码版本库,它们被用于保持源代码的有序。用户可以跟踪应用程序源代码的变化,显示不同版本的区别,并可以确定项目分支。而且,它们使得在应用程序部署中进行部分更新成为可能。
很明显,版本控制系统软件是跟踪源代码所必需的,它对于解决应用程序配置问题有非常大的暴涨龙头源码帮助。在本文中,我们将不会把重点放在版本控制系统上,因为这方面已经有很多相关的材料了。在此,我们将关注版本控制问题中的一个小话题:如何使Web应用程序的配置更加便捷(尤其是使用Spring
MVC框架编写的Web应用程序)。
问题是:我们在此讨论的是一种什么样的配置?任何Web应用程序都需要一些资源,这些资源通常都是其所运行的服务器所特有的,例如数据库URL、发送电子邮件的SMTP服务器,以及包含专用软件文件的文件夹等。这样的设置应该集中,从而使应用程序配置更加简单。
但是,这只是这个问题最简单的一种版本。有时候,在应用程序开发中需要更加复杂的配置。这意味着,必须将各次部署中的不同Bean连接起来,而这会使问题更加复杂。
这些应用程序配置问题的解决方案有诸多优势,包括:简化应用程序的安装和配置过程,使源代码版本控制更加简便,减少源代码版本库中的冲突现象。下面,我们将通过示例详细讨论这个话题。
问题。
我们首先来演示一下上文所提到的最简单的版本。在这一场景中,我们希望在应用程序部署中改变的是简单的配置参数,例如链接、密码等。如果您曾经使用Spring
MVC框架开发过Web应用程序,那么您应该知道这里将用到的两个配置文件:
/WEB-INF/applicationContext.xml,它让您可以配置Bean,或者显示应用程序上下文。通过这个文件,您可以定义自己的业务逻辑Bean、资源以及其他可以与Web端口相关联的所有Bean。
/WEB-INF/[servlet-name]-servlet.xml,它被用于配置Web层、视图解析器、控制器、校验器以及其他所有MVC框架中必需的Bean。[servlet-name]指的是在web.xml部署描述符中定义的Spring
dispatcher servlet的名称。
那么问题在哪儿呢?问题就出在applicationContext.xml中将包括一些特定于主机的Bean。本文将定义。其中,最明显的一个示例就是包含了JDBC连接信息的bean,但是任何一种稍微复杂些的应用程序都有十几个类似的Bean。看一下下面的示例:
<bean
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property >
<value>org.postgresql.Driver</value>
</property>
<property >
</property>
<property >
<value>postgres</value>
</property>
<property >
<value></value>
</property>
</bean>
这个解决方案的问题在于对applicationContext.xml文件的维护。对于初学者来说,设想一下,项目放在源代码版本控制系统中,例如CVS。下面,假设您希望在网站中添加新的功能,那么就需要在应用程序上下文定义中添加额外的Bean定义。问题是如何在生产服务器上体现这些改变。
通常情况下,应用程序的本地实例不会与活动站点使用同样的数据库,因此applicationContext.xml文件将包括让您能够访问本地数据库的设置。当您想提交在源代码版本库中的改变时,就需要注意这些特定于主机属性的同步性。版本库中的文件最终可能使用本地设置中的配置。如果想在生产服务器上更新配置,就必须手动同步这些属性的值。这是非常枯燥的任务,而且还非常容易出错。
对于应用程序的每个实例来说,这个问题更加重要。假如有三位开发人员正在使用代码段基址,而且他们使用的是本地的数据库。当您提交更改的时候,他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步这些更改,然后提交他们的工作。这样一来,版本控制系统对于这些配置文件来说已经毫无用处。如果曾经使用过Spring
MVC,那么您应该知道applicationContext.xml是应用程序中的关键组件,因为是它将所有的东西粘合在一起。所以,我们需要一种机制来帮助使应用程序中各项保持有序,这点非常重要。
正如前面所提到的,这是您可能遇到的较简单的配置问题。更难的问题出现在当需要在不同服务器中进行不同的Bean连接的时候。这类问题常会出现在日常软件开发任务中。例如,假如您的产品有一个客户身份验证模块,可以对来自关系数据库或LDAP服务器中的用户进行身份验证。自然,这一身份验证模块可以使用抽象了特定版本库的Bean进行配置。如果您想改变不同应用程序部署中验证用户的方式,就需要在applicationContext.xml文件中进行不同的Bean连接。这种配置问题常见于在部署中有可配置特性的所有应用程序。
在下文中,我们将讨论这两种配置问题。首先我们会关注同步的Bean属性问题及其解决方案,接下来,我们会讨论更加复杂的同步Bean连接问题。
解决方案
同步Bean属性
这个问题的一种可行的解决方案是将所有特定于主机的参数都放到普通的Java属性文件中,使用Spring的PropertyPlaceHolderConfigurer类,将这些参数写入Bean属性中。
使用这一解决方案,我们可以生成如下的属性文件(/WEB-INF/jdbc.properties):
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=
我们的Bean配置如下:
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property >
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property >
<value>${ jdbc.driver}</value>
</property>
<property >
<value>${ jdbc.url}</value>
</property>
<property >
<value>${ jdbc.user}</value>
</property>
<property >
<value>${ jdbc.password}</value>
</property>
</bean>
如上所述,我们定义了一个PropertyPlaceholderConfigurer类的实例,并将其位置属性设置为我们的属性文件。该类被实现为Bean工厂的后处理器,并将使用定义在文件中的属性来代替所有的占位符(${ ...}value)。
利用这种技术,我们可以从applicationContext.xml中移除所有特定于主机的配置属性。通过这种方式,我们可以自由地为该文件添加新的Bean,而不必担心特定于主机属性的同步性。这样可以简化生产部署和维护。
同步性连接
上面的技术解决了第一个问题,可是如果您计划修改不同应用程序部署之间的Bean连接,这一技术便不很适合。针对这一问题的一个解决方案便是额外创建一个名为applicationContext-[hostname].xml
的XML定义文件。其中[hostname]是部署应用程序的主机的名称。例如,在本地的机器上,这个文件通常名为applicationContext-localhost.xml,而在部署时,它可能更名为applicationContext-somehost.com.xml。
可以猜测,这一文件必须包括特定于某一主机的所有配置Bean。在本文中,我们将假设dataSource
bean定义将位于这类文件中,而不是通用的applicationContext.xml定义。当然,这种机制与前者并非冲突,但是为了更加简单明了,我们将只关注这种方法。
既然我们已经有了特定的配置,下面我们就来讨论一下如何将其整合到整个Spring
MVC配置概念中。要达到这一目的,可以有许多方法,我们将详细地一一说明。但首先,我们应该注意到,由于有些Bean可能位于独立的配置文件中,因此在applicationContext.xml中,所有对它们的局部引用都必须更换成全局名称。
例如,如下引用:
<property
>
<ref local="someBean"/>
</property> 应更改为:
<property >
<ref bean="someBean"/>
</property> 在这之后,我们有很多可以添加额外的资源以用于配置的方式。其中最明显的就是使用<import>标签将这一额外资源包含在applicationContext.xml配置文件中。使用时,要将该标签放在applicationContext.xml文件开头。例如:
<import
resource="applicationContext-somehost.com.xml"/>
现在,在独立的XML定义文件和普通的应用程序上下文定义文件中的所有通用Bean定义都有了特定于主机的连接。由于大多数的Bean都不是特定于主机的,因此我们可以像处理Web应用程序中的其他资源一样自由地处理applicationContext.xml文件,并可以通过合适的版本控制系统与其进行同步。
但是,上述方法也有一定的弊端。如果您想保留不同XML文件的不同配置,就仍然必须担心applicationContext.xml的同步性,因为资源的名称必须根据不同服务器进行更改。虽然与原有的解决方案相比有了很大提高,只需更改文件名,但是这还是需要开发人员的手动协助。
由于与applicationContext.xml相比,主机配置不需如此频繁地进行更改,因此下一步便是将主机配置移动到web.xml文件中(如果可能的话)。幸运的是,我们有一个可用的解决方案。看一下下面关于web.xml配置的片断:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-somehost.com.xml
</param-value>
</context-param> 正如您所看到的,除了web.xml文件中常有的ContextLoaderListener之外,我们还添加了contextConfigLocation上下文参数配置。这一参数用于指示框架查找这些配置文件的位置。如果这一参数被省略,则Spring就只能到applicationContext.xml中查找。这里我们也定义了特定于主机的配置文件来使用。
利用这种方法,我们将所有特定于主机的配置从applicationContext.xml文件中移除,这样便减轻了其在不同应用程序部署中的同步性。
如果这种方法成为您的新习惯,您还可以使其更加灵活。通过遵守下列指令,也可以将特定于主机的配置从web.xml文件中移除。
为此,需要创建特定于我们的应用程序上下文的类:
package
net.nighttale.spring.util;
import java.net.InetAddress;
import
org.springframework.web.context.support.XmlWebApplicationContext;
public
class PerHostXmlWebApplicationContext
extends XmlWebApplicationContext {
protected String[] getDefaultConfigLocations() {
String hostname = "localhost";
try {
hostname =
InetAddress.getLocalHost().getHostName();
} catch (Exception e) {
}
String perHostConfiguration =
DEFAULT_CONFIG_LOCATION_PREFIX
+ "applicationContext-"
+ hostname
+ DEFAULT_CONFIG_LOCATION_SUFFIX
logger.debug(
"Adding per host configuration file: "
+ perHostConfiguration
);
if
(getNamespace() != null) {
return new String[] {
DEFAULT_CONFIG_LOCATION_PREFIX
+ getNamespace()
+
DEFAULT_CONFIG_LOCATION_SUFFIX
, perHostConfiguration};
}
else {
return new String[] {
DEFAULT_CONFIG_LOCATION
, perHostConfiguration};
}
}
}
这个类拓展了Spring中常被作为默认值使用的XmlWebApplicationContext。XmlWebApplicationContext类将Web应用程序的配置从XML定义文件中复制过来。默认情况下,它可以配置来自applicationContext.xml和[servlet-name]-servlet.xml文件中的应用程序。这个类执行的惟一一项额外任务便是获取它所在的主机名称,并将applicationContext-[hostname].xml文件添加到配置文件列表中。
为了使用这个类,我们需要对其进行编译,将其包含在类途径中,并指示Spring框架使用它。前两步非常简单,我们就不在此赘述。我们可以指示Sping通过contextClass上下文参数来使用它。除了web.xml文件中的原有配置,我们还可以添加下列内容:
<context-param>
<param-name>contextClass</param-name>
<param-value>
net.nighttale.spring.util.PerHostXmlWebApplicationContext
</param-value>
</context-param>
如果我们使用这一配置片断,将会有三个文件被用于初始化这个框架:[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xml。
正如您所看到的,applicationContext.xml和web.xml文件已经完全摆脱了任何特定的配置细节,而且您也不必担心会在更新应用程序时破坏配置。
但是,这种方法有一个不足之处。因为,不论是否会使用,都需要在应用程序部署中有第三个配置文件。在这种情况下,便不需要特定于主机的配置。例如:
<?xml
version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD
BEAN//EN"
"Address.getLocalHost().getHostName())
可以将其作为Java代码执行,也可在喜欢使用的脚本语言(如BeanShell或Groovy)中作为一个具有Java风格语法的脚本执行。在获取了主机的名称之后,应该创建一个默认的/WEB-INF/applicationContext-[hostname].xml空文件夹(如我们上面所定义的),然后便可以开始了。