一、打开jsp页面无法加载部分或全部图片(统一解决方法)
1.将绝对路径改成相对路径通过${pageContext.request.contextPath }定位到项目主目录下(即与src下的包目录和webroot的子目录)等级相同,再进入文件查找图片
如下:${pageContext.request.contextPath }/resource/images/tab_05.gif
2.检查图片文件大小写
3.更改图片格式,如果是.png的改成.jpg的;如果是jpg的改成.gif或.png(对于部分图片无法显示,通过改变该图片格式,不是所有图片都改)
二、使用request需要注意的问题
1.request只能保证这个action(或,controller,servlet)的参数能传到下一个页面(或action,controller,servlet),如果要让参数能够在下下一个页面显示,就要在下一个action再次设置,或者直接将参数设置成session。
2.页面布局为frameset的时候要特别注意使用request,因为request只能保证一次数据传递,如果页面的总布局是一个页面(例main.jsp),进入分支页面(top.jsp.left.jsp,center.jsp,bottom.jsp)是没有数据传递的,所以此时不能用request
3.实际业务开发就是显示当前登录用户名,登录成功后将用户名设置为request,如果进入的页面布局为frameset是还要进入分支页面,在分支页面(top.jsp)是不会显示用户名,最好将其设置为session,而且这样也可以解决重定向跳转页面request无效的不能传递数据
三、出现乱码
1. 导入项目乱码
(1)先查看开发环境编码:-->window-->preferences-->输入出现乱码的文件(假如html出现乱码在搜索框输入html找到html在工作环境中默认的编码格式并修改为utf-8)
(2)在project explorer直接右击项目中出现乱码的文件-->properties看到相应文件(假如是java代码对应的就是resource)的编码格式统一改为utf-8
2.web层出现乱码
(1)(在action,controller,servlet中)简单手动直接设置,解决单个action的乱码问题
请求统一格式:(只能解决post乱码)
request.setCharacterEncoding("UTF-8");
响应:
返回html格式至前端:
response.setCharacterEncoding("text/html;charset=UTF-8");
返回json格式至前端:
response.setContentType("text/json");
response.setCharacterEncoding("UTF-8");
(2) 运用框架
a.Struts2:在struts.xml文件中,进行常量配置(不是很好用,只能解决post提交,而且有时候post提交还不能解决,struts2低版本配置解决无效)
<constant name="struts.i18n.encoding" value="UTF-8"/>
b.springmvc自带的字符编码过滤器(只能解决post提交)
<!-- Spring字符集过滤 -->
<filter>
<description>字符集过滤器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<description>字符集编码</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3).tomcat字符编码配置(解决get提交)
tomcat服务器的默认编码是‘ISO-8859-1’,打开conf目录下的server.xml,在70行
将
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改成
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
/>
这样tomcat服务器对于get请求的默认编码就变成了utf-8
(4).手动书写过滤器(解决get/post提交,推荐使用)
package com.ncu.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
@WebFilter("/*")
public class GenericEncodingFilter implements Filter {
/* *
* 通用编码解决方案
*/
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
public void init(FilterConfig filterConfig) throws ServletException {}
}
// 自定义request对象
@SuppressWarnings({ "unchecked", "rawtypes" })
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
private boolean hasEncode;
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}
3.插入数据库中文变成???
如果是xml文件在数据库名后加上(&在xml上要用&)
?useUnicode=true&characterEncoding=UTF-8
如果是properties文件在数据库名后加上(&实际就是&在xml上要转义)
?useUnicode=true&characterEncoding=UTF-8
4.数据库出现中文乱码
直接右击数据库,将数据库编码格式改为utf-8