重新学习struts
这就是所谓的一边工作一边学习。
今天准备把给公司写个管理页面,按照之前的路数,写起来应该挺快,但是不太规范。也就沉下心来学习一下了。
第一个学习的是,之前,在学校,听师兄说过,对页面编码可用interceptor去统一拦截处理。百度了一下,看来看去只有一份代码,试了一下,对响应的内容不生效,只对请求参数生效。
第二个学习的是,异常处理。
也是在学校的时候,听老师说过,struts2有提供一个异常处理机制。
平常我们有些异常处理,会在代码中写try catch。
public String login(){ try{ //do something }catch(SQLException e){ return "SQLError"; //去struts.xml中找对就"SQLError"这个视图 } return SUCCESS; }
而现在struts2中,在action的方法中,直接抛出异常,代码如下(如果是runtime异常,可以不用抛出)
public String login() throws SQLException{ //do something return SUCCESS; }
两份代码,效果是一样的,如果出现sql异常,都会跳转到SQLError对应的视图。但是后者代码不用写一些try catch代码,使代码更加简洁。而异常处理也可以统一使用(复用)。
但是,后者要配置一下struts.xml文件。(看到这里,我又想起,struts.xml可以有多个,所以又再去学了这个知识点,而之前所有配置都写在一个struts.xml文件中)
struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.multipart.saveDir" value="tem"></constant> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.multipart.maxSize" value="52428800000" /> <constant name="struts.action.extension" value="action,do,webwork" /> <include file="struts-user.xml"></include> <include file="struts-error.xml"></include> </struts>
struts-user.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.multipart.saveDir" value="tem"></constant> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.multipart.maxSize" value="52428800000" /> <constant name="struts.action.extension" value="action,do,webwork" /> <package name="web" extends="exception"> <action name="user_*" class="UserAction" method="{1}"> <result name="input">/index.jsp</result> <result name="success">/WEB-INF/view/management.jsp</result> </action> </package> </struts>
struts-error.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.multipart.saveDir" value="tem"></constant> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.multipart.maxSize" value="52428800000" /> <constant name="struts.action.extension" value="action,do,webwork" /> <!-- 错误、异常相关的 --> <package name="exception" extends="struts-default"> <global-results> <result name="error">/WEB-INF/view/error/error.jsp</result> <result name="sql">/WEB-INF/view/error/sql_error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping> </global-exception-mappings> </package> </struts>
从上面的xml的代码可以看出,我又学了一个知识点。
之前一直没注意struts.xml里面的package里面name 和 extends这个作用。
今天通过这个学习又发现了。
一开始,直接抛出异常,照理说,应该跳转到sqlerror对应的视图上去的,但是,提示,UserAction这个action没有对应的视图。
后来再看看,试了一下继承,让struts-user.xml里的web那个package继承struts-error.xml里面的exception这个package,代码就调通了。
之前完全对package这个节点里面的name属性乱起名。现在明白了。
后来又查了一下,package是可以多继承的。