最近维护一个比较老的项目,维护好了以后需要发布在tomcat7上。部署过程出现了好多的问题。下面总结一下与大家分享。
第一个问题:
上午部署项目出现问题,有一个页面无法打开:
报错如下:
严重:Servlet.service() for servlet jsp threw exception
javax.el.ELException:The identifier [new] is not a valid Java identifier as required by section 1.19of the EL specification (Identifier ::= Java language identifier). This checkcan
be disabled by setting the system property org.apache.el.parser.SKIP_IDENTIFIER_CHECKto true.
atorg.apache.el.parser.AstDotSuffix.setImage(AstDotSuffix.java:45)
atorg.apache.el.parser.ELParser.DotSuffix(ELParser.java:1069)
atorg.apache.el.parser.ELParser.ValueSuffix(ELParser.java:1035)
atorg.apache.el.parser.ELParser.Value(ELParser.java:980)
atorg.apache.el.parser.ELParser.Unary(ELParser.java:950)
atorg.apache.el.parser.ELParser.Unary(ELParser.java:894)
atorg.apache.el.parser.ELParser.Multiplication(ELParser.java:714)
atorg.apache.el.parser.ELParser.Math(ELParser.java:634)
atorg.apache.el.parser.ELParser.Compare(ELParser.java:446)
atorg.apache.el.parser.ELParser.Equality(ELParser.java:340)
atorg.apache.el.parser.ELParser.And(ELParser.java:284)
atorg.apache.el.parser.ELParser.Or(ELParser.java:228)
atorg.apache.el.parser.ELParser.Choice(ELParser.java:185)
atorg.apache.el.parser.ELParser.Expression(ELParser.java:177)
atorg.apache.el.parser.ELParser.DynamicExpression(ELParser.java:149)
atorg.apache.el.parser.ELParser.CompositeExpression(ELParser.java:46)
atorg.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:114)
atorg.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:171)
atorg.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:216)
atorg.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:66)
atorg.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:966)
atorg.apache.jsp.WEB_002dINF.jsp.collectionForm_jsp._jspx_meth_c_005fif_005f0(collectionForm_jsp.java:595)
atorg.apache.jsp.WEB_002dINF.jsp.collectionForm_jsp._jspService(collectionForm_jsp.java:351)
atorg.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
atjavax.servlet.http.HttpServlet.service(HttpServlet.java:727)
atorg.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
atorg.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
atorg.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
atjavax.servlet.http.HttpServlet.service(HttpServlet.java:727)
atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
atorg.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
atorg.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
atorg.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
atorg.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at
。。。。。。
代码是这样写的:
<c:iftest="${!command.new}">
<INPUTtype="submit" name="delete" value="Delete"style="margin-right: 5px; font-size: 8pt; font-family: Arial; width:70px"
onclick="returnconfirm(‘Are you sure you want to delete this repository?‘)" />
</c:if>
最后的解决方法时在tomcat的catalina.properties配置文件的最后加上:
org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
分析原因:
tomcat7可能带来的问题
1、struts标签校验更加严格,如果struts标签中存在嵌套双引号会报错。
2、对EL表达式校验更加严格,升级tomcat版本后,以前的代码可能不能用了。
3、安全级别默认较高,如applet不能够访问request。
具体现象可能是:
1、报错Attribute
value is quoted with " which must be escaped when used withinthe value
2、containsinvalid
expression(s): javax.el.ELException: [do] is not a valid Javaidentifier
atorg.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
3、没现象就是request=null
解决方法:
$CATALINA_BASE/conf/catalina.properties增加
org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
$CATALINA_BASE/conf/Catalina/localhost/webapp.xml增加
<Context path=""docBase="/vmind/vmind" useHttpOnly="false" debug="0"
reloadable="false">
或修改server.xml的context选项,增加useHttpOnly="false"
即可。
第二个问题:
tomcat文件夹有空格,用类加载器获取路径时会将空格转换为20%
今天遇到一个问题,当tomcat文件夹有空格,用类加载器获取路径时会将空格转换为20%..
解决办法将路径先用URL编码;
eg:
String path = CustFactory.class.getClassLoader().getResource("config.properties").getPath();改为
String path =CustFactory.class.getClassLoader().getResource("config.properties").toURI().getPath();
第三个问题
自己拷到服务器上的tomcat总是无法启动,最终找到原因是配置了CATALINA_HOME环境变量,导致每次启动的tomcat都是环境变量配置的路径下的tomcat。
设置CATALINA_HOME环境变量
设置CATALINA_HOME环境变量
1、CATALINA_HOME是TOMCAT安装路径的别名,目的是为了方便使用TOMCAT
2、计算机>属性>环境变量, 新建环境变量。变量名为CATALINA_HOME,变量值tomcat的解压目录,我电脑上的为:“F:\apache-tomcat-7.0.12”,注意后面不用多加“\”或者“;”
3、在环境变量Path中,新增加“
TALINA_HOME%\bin\"
4、启动tomcat :进入命令行cmd,输入startup.bat
5、打开浏览器,输入:http://localhost:8080,看tomcat是否正常启动
6、关闭tomcat:进入命令行cmd,输入shutdown.bat