1.新建一個Filter,并在web.xml中注冊
//注意,filter注冊需要放在servlet注冊的前面,否則報錯
<filter>
<filter-name>globladecoder</filter-name>
<filter-class>com.cskaoyan.bookStore.web.filter.GlobalDecodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>globladecoder</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
2.新建一個過濾器。并實現其dofilter方法
public class GlobalDecodeFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
response.setContentType("text/html;charset=utf-8");
//判斷post和get,切記POST一定要大寫
if (req.getMethod().equals("POST"))
{ // Post這么解決
request.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
}
else
{
//包裝get提交的請求數據
HttpServletRequest request2 = new MyRequest(
(HttpServletRequest) request);
chain.doFilter(request2, response);
}
}
@Override
public void destroy()
{
}
}
}
3.包裝類實現getParameter三個API
class MyRequest extends HttpServletRequestWrapper
{
public MyRequest(HttpServletRequest request)
{
super(request);
}
@Override
public String getParameter(String name)
{
//需要傳進來最初的request
String param = super.getParameter(name);
String key = null;
try
{
byte[] bytes;
if (param != null)
{
//解碼
bytes = param.getBytes("iso-8859-1");
key = new String(bytes, "utf-8");
}
}
catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return key;
}
@Override
public Map<String, String[]> getParameterMap()
{
//Map
Map<String , String[]> permeterMap = super.getParameterMap();
//取出map中的映射關系
Set<Entry<String, String[]>> entrySet = permeterMap.entrySet();
//遍歷entrySet 取出鍵值對
for (Entry<String, String[]> entry : entrySet)
{
String[] values = entry.getValue();
for (String string : values)
{
try
{
//逐個遍歷key的valu值,立即解碼
byte[] bytes = string.getBytes("ISO-8859-1");
string = new String(bytes, "utf-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
}
return permeterMap;
}
@Override
public String[] getParameterValues(String name)
{
//數組
//拿到包含參數的key和value的map
Map<String, String[]> permeterMap = getParameterMap();
//通過傳進來的key拿到參數值數組(checkbox)
String[] strings = permeterMap.get(name);
return strings;
}
以后無論是get或者post方式的getParameter的時候都不需要再編碼解碼了