因公司使用的eadp底层jar包拓展需求,欲将success,error等公共jsp页面封装到底层jar包, 这样公用jsp就不会被变更.
第一种方案:使用struts2提供的struts2-embeddedjsp-plugin-2.3.3.jar 通过引入该jar包 配置struts.xm已达到l直接访问jsp
参考网址: https://cwiki.apache.org/confluence/display/WW/Embedded+JSP+Plugin 该网址有简单的配置说明,但使用该方法会出现几点问题,第一个是直接输出中文乱码, 第二个是如何引入jar包中相关的js、css、图片等信息
第一个问题直接输出中文乱码的问题,由几个方面决定,文件编码的格式 及tomcat中的server.xml默认的编码以及jsp中的<@page > jsp本身就是一个servlet输出.一般jsp都是访问时tomcat通过pageEncoding="UTF-8"进行编译 浏览器是由contentType="text/html; charset=UTF-8" 编码格式解析中文.但通过配置以上几个参数统一为gbk及utf-8, 均不能使输出中文恢复正常,该jar包在编译jar包中jsp时都是使用utf-8来进行编码,使用gbk来进行解码,所以导致乱码,最后通过<%String str1=new String("测试弹出".getBytes("utf-8"),"utf-8");%> <h3><%=new String(str.getBytes("gbk"),"utf-8") %></h3> 直接对该中文进行输出,则乱码问题解决. 后折磨了三天,想通过比较简单的配置达到这个目的,通过插入jsp表达式<%response.setHeader("content-type","text/html;charset=UTF-8");response.setContentType("text/html;charset=UTF-8");response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); out.print("登录信息7");%> 以及在web.xml调用相关的encodingFilter等方法. 都没有任何起色, 只能使用直接输出new String(str.getBytes("gbk"),"utf-8") 解码这种方法来实现,但该方法不适合在底层通用的jar包中使用, 故暂时放弃该方案.
第二个问题引入jar包中相关的js和css 直接引入相关的js和css无论绝对路径和相对路径都会失败,只能通过调用servlet来拿到相关的文件.在web.xml中配置相关的servlet
<servlet>
<servlet-name> javascriptservlet </servlet-name>
<servlet-class> example.JavaScriptServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> javascriptservlet </servlet-name>
<url-pattern> *.js </url-pattern>
</servlet-mapping>
public void doGet(HttpServletRequest request,HttpServletResponse response)throws
ServletException,IOException {
String fileUri = request.getRequestURI();
String contextPath = request.getContextPath();
if(!contextPath.endsWith( "/ ")){
contextPath = contextPath + "/ ";
}
fileUri = fileUri.substring(contextPath.length()-1,fileUri.length());
//注意:此处未考虑并发访问异常
BufferedReader in = new BufferedReader(new InputStreamReader(getClass().
getClassLoader().getResourceAsStream(fileUri)));
PrintWriter out = response.getWriter();
response.setContentType("text/javascript;charset=UTF-8");
String line = null;
while((line = in.readLine()) != null){
out.println(line);
}
in.close();
out.close();
}
在jsp页面中配置引入 <script src="script/jquery.js"></script>
css及图片也是如此实现,但会影响性能
第二种方案 是想通过tomcat启动时候直接将jsp解压到相关的目录下, 该方案一共有两个难点,第一个是怎么拿到要解压的jar包 第二个是怎么只解压出jsp.
配置web.xml