今天遇到一个乱码问题。jsp页面代码如下,页面编码为UTF-8:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@taglib uri="/struts-tags" prefix="s" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>My JSP 'Category_input.jsp' starting page</title> 14 15 <meta http-equiv="pragma" content="no-cache"> 16 <meta http-equiv="cache-control" content="no-cache"> 17 <meta http-equiv="expires" content="0"> 18 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 19 <meta http-equiv="description" content="This is my page"> 20 <!-- 21 <link rel="stylesheet" type="text/css" href="styles.css"> 22 --> 23 24 </head> 25 26 <body> 27 <form action="admin/Category-update" method="post"> 28 <input type="hidden" name="category.id" value='<s:property value="category.id"/>'> 29 name:<input name="category.name" value='<s:property value="category.name"/>'/> 30 description:<textarea name="category.description"><s:property value="category.description"/></textarea> 31 <input type="submit" value="update" /> 32 </form> 33 </body> 34 </html>
web.xml配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 3 <display-name>bbs2</display-name> 4 <welcome-file-list> 5 <welcome-file>index.jsp</welcome-file> 6 </welcome-file-list> 7 8 <filter> 9 <filter-name>struts2</filter-name> 10 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 11 </filter> 12 13 <filter-mapping> 14 <filter-name>struts2</filter-name> 15 <url-pattern>/*</url-pattern> 16 </filter-mapping> 17 18 </web-app>
struts.xml配置如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 8 <!-- form表单提交中文乱码 --> 9 <constant name="struts.i18n.encoding" value="UTF-8" /> 10 <!--<constant name="struts.enable.DynamicMethodInvocation" value="false" />--> 11 <constant name="struts.devMode" value="true" /> 12 <!--<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>--> 13 14 <package name="front" namespace="/" extends="struts-default"> 15 <!-- <default-action-ref name="Category-list"></default-action-ref> 不能与*-*一起用--> 16 <action name="Category-list" class="com.lch.bbs2009.action.CategoryAction"> 17 <result>/admin/Category-list.jsp</result> 18 </action> 19 </package> 20 21 <package name="admin" namespace="/admin" extends="struts-default"> 22 23 <action name="index"> 24 <result>/admin/index.html</result> 25 </action> 26 27 <action name="*-*" class="com.lch.bbs2009.action.{1}Action" method="{2}"> 28 <result name="success">/admin/{1}-{2}.jsp</result> 29 <result name="input">/admin/{1}-{2}.jsp</result> 30 </action> 31 32 </package> 33 34 </struts>
action代码如下:
1 package com.lch.bbs2009.action; 2 3 import java.util.List; 4 5 import com.lch.bbs2009.model.Category; 6 import com.lch.bbs2009.service.CategoryService; 7 import com.opensymphony.xwork2.ActionSupport; 8 9 /** 10 * @author licheng 11 * 12 */ 13 public class CategoryAction extends ActionSupport { 14 /** 15 * 16 */ 17 private List<Category> categories; 18 private CategoryService categoryService = new CategoryService(); 19 private Category category; 20 private int id; 21 22 public String list() { 23 categories = categoryService.queryAll(); 24 return SUCCESS; 25 } 26 27 public String add() { 28 categoryService.add(category); 29 return SUCCESS; 30 } 31 32 public String update() { 33 categoryService.update(category); 34 return SUCCESS; 35 } 36 37 public String delete() { 38 categoryService.deleteById(id); 39 return SUCCESS; 40 } 41 42 public String addInput() { 43 return INPUT; 44 } 45 46 public String updateInput() { 47 this.category = this.categoryService.loadById(id); 48 return INPUT; 49 } 50 51 public List<Category> getCategories() { 52 return categories; 53 } 54 55 public void setCategories(List<Category> categories) { 56 this.categories = categories; 57 } 58 59 public CategoryService getCategoryService() { 60 return categoryService; 61 } 62 63 public void setCategoryService(CategoryService categoryService) { 64 this.categoryService = categoryService; 65 } 66 67 public Category getCategory() { 68 return category; 69 } 70 71 public void setCategory(Category category) { 72 this.category = category; 73 } 74 75 public int getId() { 76 return id; 77 } 78 79 public void setId(int id) { 80 this.id = id; 81 } 82 83 }
通过debug模式调试,发现action中接收到的值就是乱码的。
在网上找解决办法
1.检查页面编码,服务器编码,数据库编码是否一致。我的均为UTF-8;
2.在你配置文件的前面写上<constant name="struts.i18n.encoding" value="UTF-8" />。我写了,无效;
3.在struts.properties中添加
struts.locale=zh_CN
struts.i18n.encoding=UTF-8 以此设定locale、encoding字符集。
补充:struts.properties是可以不要的!!struts2的默认配置文件为default.properties,位于struts2-core-2.x.x.jar的org.apache.struts2包下面。如果一个项目中一个属性同时都在两个文件中配置了,它有一个加载顺序:先加载struts.xml,再加载struts.properties。也就是说struts.properties可以覆盖struts.xml里面的配置。具体是否要用struts.properties得视具体情况而定。
我添加了此文件并修改了,结果无效。
4.在web.xml中加入
1 <!-- zh-cn encoding --> 2 <filter> 3 <filter-name>struts-cleanup</filter-name> 4 <filter-class> 5 org.apache.struts2.dispatcher.ActionContextCleanUp 6 </filter-class> 7 </filter> 8 <filter-mapping> 9 <filter-name>struts-cleanup</filter-name> 10 <url-pattern>/*</url-pattern> 11 </filter-mapping>
补充:web.xml中Encodingfilter的位置应该在Struts2的FilterDispatcher之前,因为要先调整字符集,然后进入Action.按照Struts2的API,filter的顺序是 :
struts-cleanup filter
SiteMesh filter
FilterDispatcher
结果无效
5.表单提交都是通过servlet调post()或get()方法处理的,再把结果返回到客户端。写个过滤类,表单提交都先到servlet请求,如果在请求前加个过滤器,将字符都转为中文再进行处理
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request_1 = (HttpServletRequest) request;
HttpServletResponse response_1 = (HttpServletResponse) response;
// 转换编码,并且加上去缓存
request_1.setCharacterEncoding("GBK");
response_1.setCharacterEncoding("GBK");
chain.doFilter(request, response);
}我像这样建一个servlet之后,上面都是红叉叉!!
谁能教教我怎么解决,谢了!!
我坑爹的搞了一下午,最后问题解决了版本问题!!!!!
Struts2.1.8版本之前有个Bug ,中文乱码。貌似搞成GBK可以,不想纠结了,直接换jar包吧!!记得马士兵老师之前讲过的,可惜我忘了。虽然弄了一下午,但还是学到了不少。呼,在此感谢小锋老师远程帮我解决了问题!!!!!