ã转载ãSpringMVC使ç¨@ResponseBodyè¾åºå符串æ¶éå°çä¹±ç é®é¢åè§£å³åæ³
ä»çªåéå°ä¹±ç é®é¢ï¼ææ¶åçè§å¾è±è¯æ¯è¯çé£äºå°åºç¡®å®æºçäºçï¼è³å°ä¸ç¨ä¸ºäºè¿ä¸ªç»å ¸éº»ç¦å»æè ¾ã
ç½ç»ä¸è®¨è®ºä¹±ç é®é¢çæç« å¾å¤ï¼å 为åä½è 使ç¨çè®¡ç®æºç¯å¢çä¸åï¼å¾å¾ä¸æ¯å¾å ¨é¢ã
è¿éé常æ¨èçä¸ç¯æç« ï¼
http://dohkoos.name/java-garbled-analysis.html
ç®èè¨ä¹ï¼ä¹±ç çâæ ¹æ¬åå æ¯ç±äºç¼ç åè§£ç éç¨ç䏿¯åä¸ç§ç âãä¾å¦ä½è æä¸¾çä¾åï¼ä½¿ç¨GBKç¼ç 为UTF-8ï¼ä½¿ç¨ISO-8859ä»UTF-8è§£ç ï¼å¯è½ä¼å¯¼è´ä¹±ç é®é¢ãè¿å°±å¥½æ¯æä¸ç¯ä¸ææç« æ³ç»çäºçï¼ä¸è¿è¿ç¯æç« å ç±å¼ ä¸ç¿»è¯æä¸ºäºè±æï¼ç¶ååç±æåç¿»è¯æä¿æï¼è䏿¯ç¿»è¯å䏿ï¼ï¼ä½æ¯çäºåªç徿䏿ï¼äºæ¯å°±éº»çäºã
æä»¬éè¦ä¿æç¼ç æè è§£ç ä¸¤å¤´ï¼æä½¿ç¨çå符éè½¬æ¢æ¹åéè¦æ£å¥½ç¸åï¼ä½¿ç¨ GBK â> UTF-8 ä¸ UTF-8 â> GBKãç±äºJavaéç¨äºUTF-8ç¼ç ï¼æä»¥ç¼ç è§£ç å以UTF-8为ä¸ä»ã
对äºç¿»è¯èè¨ï¼å°±æ¯å ç¸å½äºï¼ å ä¸è¯è±ï¼å¯¹åºçè§£ç ï¼åè¿æ¥å°±æ¯ è±è¯ä¸ã
éå°ä¹±ç é®é¢ï¼éå¸¸çæ£æ¥é¡¹å æ¬ï¼
1. ç¼è¾å¨ä¿åæä»¶çå符éï¼
2. æ°æ®åºçå符éï¼
3. åºç¨æå¡å¨æè Webæå¡å¨å¤çå符串éç¨çå符é
4. JSP对äºå符é声æ
5. Servletè¿æ»¤å¨ï¼ä»¥åMVCæ¡æ¶æ¦æªå¨å¯¹äºå符éçå¤ç
6. å ¶å®æ¶åå符éå¤ççç¯è
æ£æ¥å个ç¯èï¼ç»ä¸æUTF-8è®¾ç½®ãæ¨ææè¿æ¬¡ç¢°å°çé®é¢å±äºä¸è¿°ç¬¬6䏿 åµã
å 为æ¯éè¿SpringMVCæä¾ç注解@ResponseBodyæ¥è¿åä¸ä¸ªJSONå符串ï¼ç¶åå¨å®¢æ·ç«¯ä¸è§£æJSON(ç°å¦ä»ä»¥JSONä½ä¸ºæ°æ®äº¤æ¢æ ¼å¼è²ä¼¼è¶æ¥è¶æ¶é«¦äºï¼å®¢æ·ç«¯æç¨çæ¯è¾å¤çæ¯jqGridæè ExtJS)ã
Controller代ç å¦ä¸ï¼
@Controller
@RequestMapping("/*")
public class HelloController {
private transient final Log log = LogFactory.getLog(HelloController.class);
@Autowired
private UserManager mgr = null;
@RequestMapping(value="hello_list.do", method = RequestMethod.POST)
@ResponseBody
public String helloList() {
StringBuilder str = new StringBuilder("{totalProperty:100,root:[");
List<User> users = mgr.getUsers();
for (User user : users) {
str.append("{id: ").append(user.getId());
str.append(", name:'").append(user.getLastName());
str.append("', descn:'").append(user.getFullName()).append("'},");
}
str.append("{id:4, name:'ìí', descn:'ÐиÑай'},");
str.append("{id:5, name:'tchen8', descn:'䏿'}]}");
log.info(str.toString());
return str.toString();
}
}
å¨Springé ç½®æä»¶éï¼é»è®¤å¦ä¸ï¼
< !â Enables the Spring MVC @Controller programming model â>
< mvc:annotation-driven />
è°è¯ç¨åºï¼æ§å¶å°è¾åºæ¥å¿çå°æ¯ä¸æï¼ä½æ¯å¨firebugä¸çå°çæå¡å¨ç«¯éè¿æ¥çå符串æ¯???? (å¦ææ¯ âå£å£å£âè¿æ ·çè¾åºï¼éè¦å æé¤æ¯å¦ä¸ºç³»ç»çåä½ç¼ºå¤±)ï¼äºæ¯å¤ææ¯æå¡å¨æåå¾ç«¯å£åå符串æµçæ¶ä¾¯å符éä¸å¯¹ã
éè¿è°è¯è·è¸ªSpringçæºç ï¼å£°æ@ResponseBodyæ¶ï¼Springä¼éè¿AnnotationMethodHandlerAdapterå»å¯»æ¾å¯¹åºçHttpMessageConverter, æä»¬è¿é声æè¿åçç±»åæ¯Stringï¼äºæ¯å¯¹åºStringHttpMessageConverterãéè¿å®éªï¼çæµè¿ä¸ªStringHttpMessageConverterä¹å°±æ¯è§¦åçé»è®¤çå符串转æ¢å·¥ä½ç±»ã
æ¯è¾ä¸å¹¸çæ¯ï¼StringHttpMessageConverteræä½¿ç¨çé»è®¤åç¬¦éæ¯ISO-8859-1
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
}
è¿éä¸å¾ä¸æçæ¯ä¸StringHttpMessageConverter å级çç±»MappingJacksonHttpMessageConverterï¼å¤©ç¥éæ¯ä»ä¹åå ï¼åä¸ä¸ªä½è ï¼å¯¹äºè¿ä¸¤ä¸ªç±»ï¼é»è®¤å符éä¸ä¸ªæ¯ISO-8859-1ï¼ä¸ä¸ªæ¯UTF-8ã
æ¢ç¶äºå·²å¦æ¤ï¼é£å°±æ³åæ³æè¿ä¸ªå°æ¹ç¨å°çISO-8859-1乿¹æUTF-8äºãæä¸¤ä¸ªæè·¯ï¼
1. æ¿æ¢é»è®¤å符éï¼
2. æ¿æ¢StringHttpMessageConverter
æç´¢äºä¸ä¸ï¼å çå°è¿ä¸ªè§£å³åæ³ï¼
http://forum.springsource.org/showthread.php?t=81858
è¿éæä¾çæ¯ä½¿ç¨ä¸ä¸ªæè°çConfigurableStringHttpMessageConverteræ¥æ¿ä»£StringHttpMessageConverterï¼åºæ¬çæè·¯ææ¯æ¯ï¼ç±äºStringHttpMessageConverterä¸çé»è®¤å符éåé声æä¸ºfinalï¼æ æ³ç´æ¥éè¿ç»§æ¿å»è¦çï¼é£å°±æStringHttpMessageConverterç §æä¸éï¼æé 彿°ä¸æ°å¢ä¸ä¸ªä»£è¡¨å符éçè¾å ¥åæ°ï¼ç¶åå¨é ç½®æä»¶éé¢éè¿æé æ¹æ³æ³¨å ¥UTF-8ãå¨é ç½®æä»¶ä¸ï¼å°è¿ä¸ªBean声æå¨åé¢ï¼ä»èè½å¤å äºStringHttpMessageConverter被Springè¯å«åæ³¨å ¥ã
使¯è¿ä¸ªæ¹æ³å¤å°æäºè®å¹²çå³éï¼åºäºå®ç®åçä¸ä¸ªçæ¬å¯ä»¥å¦ä¸ï¼å³éè¿ç»§æ¿StringHttpMessageConverterï¼ç¶åå¨åç±»ä¸æ³¨å ¥æä»¬æ³è¦çå符éé ç½®ï¼
Javaä»£ç æ¶è代ç
public class MyStringHttpMessageConverter extends StringHttpMessageConverter {
public MyStringHttpMessageConverter(Charset defaultCharset) {
List<MediaType> mediaTypeList = new ArrayList<MediaType>();
mediaTypeList.add(new MediaType("text", "plain", defaultCharset));
mediaTypeList.add(MediaType.ALL);
super.setSupportedMediaTypes(mediaTypeList);
}
}
Beançé ç½®ä¾ç¶ç±»ä¼¼ï¼
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="messageConverters">
<util:list>
<beans:bean id="stringHttpMessageConverter" class="org.tchen8.myapp.common.ConfigurableStringHttpMessageConverter">
<beans:constructor-arg value="UTF-8" />
</beans:bean>
</util:list>
</beans:property>
</beans:bean>
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
ä¸é¢çåæ³æ¯ä»¥å±æ§æ³¨å ¥çæ¹å¼ï¼æ¿æ¢äºé»è®¤çå符éï¼ä½ä¸ºæ¤ä¹éè¦æconverteræ¿æ¢ã
å¦å¤ä¸ä¸ªæ¯è¾ç®æ´çåæ³ï¼åä¸éè¦èªå·±åconverterç±»ï¼èæ¯ç´æ¥éè¿å±æ§æ³¨å ¥ï¼ä¿®æ¹StringHttpMessageConverterçé»è®¤é ç½®ã
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="messageConverters">
<util:list>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<util:list>
<beans:value>text/html;charset=UTF-8</beans:value>
</util:list>
</beans:property>
</beans:bean>
</util:list>
</beans:property>
</beans:bean>
ä¸é¢çè¿ä¸ªåæ³ï¼å®é ä¸éè¿setSupportedMediaTypesæ¹æ³ï¼å ¶å®ä¹å°±æ¯StringHttpMessageConverterå¨ç±»æ³¨é䏿æå°çåæ³ï¼

妿åå¤çä¸ä¸StringHttpMessageConverterçæºç ï¼å¯ä»¥å°å®çç¶ç±»ä¸AbstractHttpMessageConverteræè¿ä¹ä¸ªæ¹æ³ï¼
/**
* Returns the default content type for the given type. Called when {@link #write}
* is invoked without a specified content type parameter.
* <p>By default, this returns the first element of the
* {@link #setSupportedMediaTypes(List) supportedMediaTypes} property, if any.
* Can be overridden in subclasses.
* @param t the type to return the content type for
* @return the content type, or <code>null</code> if not known
*/
protected MediaType getDefaultContentType(T t) {
List<MediaType> mediaTypes = getSupportedMediaTypes();
return (!mediaTypes.isEmpty() ? mediaTypes.get(0) : null);
}
注éä¸åçæç½ï¼âCan be overridden in subclasses.â é£å°±ä¸å¿ 客æ°äºãäºæ¯æä»¬å¤§æ¦ä¹è½æå¦ä¸çåæ³ï¼
public class MyStringHttpMessageConverter2 extends StringHttpMessageConverter {
private static final MediaType utf8 = new MediaType("text", "plain", Charset.forName("UTF-8")); @
Override
protected MediaType getDefaultContentType(String dumy) {
return utf8;
}
}
对åºçé ç½®ï¼
以ä¸çå ä¸ªæ¹æ³ï¼é½è½è§£å³@ResponseBody导è´çä¹±ç é®é¢ï¼è½ç¶StringHttpMessageConverterå°æ¥ç¡®å®æå¯è½æé»è®¤å符éä¿®æ¹æUTF-8ï¼ä»è导è´ä¸è¿°å夫æååæç½å¿æ´»ãä½ä¹ç¡®å®æè°¢æè¿ä¹ä¸ªå°é»ç¢ï¼è¿«ä½¿èªå·±å»åæé®é¢å¯»æ¾çæ¡ãæ¶è·ä¸å¨äºç»æï¼èå¨è¿ç¨å§
æåshow䏿æç页é¢ï¼