在基于struts的WEB應(yīng)用的開發(fā)中,使用多模塊開發(fā)是十分必要的,總結(jié)了一下如下:
Struts 的配置文件struts-config.xml 是Struts 框架最重要的資源之一,并且是需要頻繁改動的。如果并行開發(fā)的各個團(tuán)隊都是用這一個配置文件,勢必造成訪問沖突。Strus 框架的模塊化機(jī)制就是專門應(yīng)對這種情況的。
Struts 從1.1 版本開始增加了模塊化支持,并且一直在強(qiáng)化對模塊化的支持。不同的應(yīng)用模塊可以擁有各自的struts-config 配置文件、消息資源、Validator 框架配置文件。不同的模塊可以協(xié)同開發(fā),互不影響。
Struts 應(yīng)用配置為多模塊應(yīng)用,需要如下三個步驟:
為每個模塊分別建立一個struts配置文件;
通知模塊控制器;
使用特定的Action在模塊間跳轉(zhuǎn)。
一 給各模塊命名:
struts默認(rèn)的配置文件名是struts-config.xml,給其它模塊配置文件命名struts-config-***.xml.比如登錄模塊需要一個單獨(dú)的模塊可以命名為struts-config-login.xml;
二 通知模塊控制器:
在web.xml中加入如下代碼:
<init-param>????
????? <param-name>config</param-name>????
????? <param-value>/WEB-INF/conf/struts-config.xml</param-value>????
</init-param>????
<init-param>????
????? <param-name>config/login</param-name>????
????? <param-value>/WEB-INF/conf/login/struts-config-login.xml</param-value>????
</init-param>???
配置文件對應(yīng)的ActionServlet 初始化參數(shù)名為config。對于其他模塊,ActionServlet 初始化參數(shù)的命名原則是“config/模塊名”。如上面的代碼示例中,login 模塊的配置文件對應(yīng)的初始化參數(shù)為config/login。其中前綴“config/”是不能缺少的,后面跟模塊名。在Struts 控制器中,是通過模塊名來區(qū)分不同模塊的。在資源訪問中,也是一模塊名作為前綴來區(qū)分對不同模塊的訪問。如以“/login”開頭的路徑會告訴控制器所要訪問的將是login 模塊的資源。
三 實(shí)現(xiàn)模塊間跳轉(zhuǎn):
(1)用SwitchAction,主要用于實(shí)現(xiàn)頁面的跳轉(zhuǎn)
(2)全局轉(zhuǎn)發(fā)和局部轉(zhuǎn)發(fā),用于實(shí)現(xiàn)模塊間的跳轉(zhuǎn)
(3)采用html:link標(biāo)簽
多模塊開發(fā)示例:(Eclipse3.2+MyEclipse5.0)
1.新建一個Web Project
2.添加Struts 1.2 支持
3.在根目錄(WebRoot)下新建index.jsp頁面
4.在WebRoot目錄下新建一個模塊目錄“ModuleA”。
5.新建一個struts 1.2 module,名為“ModuleA”。
6.測試直接鏈接到其他模塊的jsp頁面(注意不能直接鏈接到其他模塊的與Action、ActionForm相關(guān)聯(lián)的頁面):
在根目錄的index.jsp頁面中添加如下代碼:
<html:link module="/ModuleA" page="/index.jsp">1.鏈接到其他模塊(ModuleA)直接鏈接到頁面</html:link><br>適用于沒有和Action,ActionForm關(guān)聯(lián)的純JSP頁面<br><p>
在ModuleA目錄下新建index.jsp頁面,完成后測試成功。
7.測試直接鏈接到其他模塊的jsp頁面(直接鏈接到其他模塊的與Action、ActionForm相關(guān)聯(lián)的頁面,應(yīng)該不能成功):
首先配置struts-config-ModuleA.xml文件:
新建一個Form、Action and JSP,用例中填寫user,添加兩個屬性:name,password。
在JSP選項卡中填寫“/ModuleA/login.jsp”,點(diǎn)擊下一步,在Path中填寫“/login”,在forward選項卡中添加一個forward,name為“OK”,Path為“/welcome.jsp”,點(diǎn)擊完成。
在ModuleA目錄下新建wellcome.jsp文件,在源碼中加入如下代碼:
<bean:write name=”userForm” property=”name” />.在UserAction.java源碼中填寫如下代碼:return mapping.findForward(“OK”)。
在根目錄下的index.jsp源碼中添加如下代碼:
<html:link module="/ModuleA" page="/login.jsp">2.鏈接到其他模塊(ModuleA)試圖連接到和Action,ActionForm關(guān)聯(lián)的頁面</html:link><br>不能直接這樣鏈接,會報Cannot retrieve mapping for action /xxx異常,因?yàn)榇藭r還是檢查struts-config.xml<br><p>
測試后果然異常。
正確做法如下:
在struts-config-ModuleA.xml文件中添加一個Action,在用例中填寫“toLoginPage”,在forward選項卡中添加一個forward,name為“toLoginPage”,Path為“/login.jsp”。
修改ToLoginPage.java的源碼為:return mapping.findForward(“toLoginPage”);。
在根目錄下的index.jsp源碼中添加如下代碼:
<html:link module="/ModuleA" page="/toLoginPage.do">3.鏈接到其他模塊(ModuleA)的xxxx.do,連接到和Action,ActionForm關(guān)聯(lián)的頁面</html:link><br>正確做法,是對2鏈接形式的更正,應(yīng)該鏈接到ModuleA的一個Action,由該Action的forward轉(zhuǎn)發(fā)到login.jsp頁面<br><p>
經(jīng)測試成功。
8.測試跨模塊表單提交(從主模塊提交表單到ModuleA模塊):
在struts-config.xml(主模塊)中新建Form、Action and JSP,用例中輸入“reg”,增加兩個屬性:sex、age,點(diǎn)擊下一步,在Path中填寫“/userReg”,Action Impl中選擇Use existing Action class,使用SwitchAction,直接finish掉。添加根目錄下的indexs.jsp文件源碼如下:
4.提交表單到其他模塊:<br>
<html:form action="/userReg?prefix=/ModuleA&page=/regOK.jsp">
sex : <html:text property="sex"/><html:errors property="sex"/><br/>
age : <html:text property="age"/><html:errors property="age"/><br/>
<html:submit/><html:cancel/>
</html:form><br><p>。
在ModuleA文件夾下新建regOK.jsp文件,在regOK.jsp文件源碼中寫入如下語句:
regOK,your sex is:<bean:write name="regForm" property="sex"/> age is:<bean:write name="regForm" property="age"/>
經(jīng)測試成功。
9.測試跨模塊表單提交(從ModuleA模塊提交表單到ModuleB模塊):
新建struts1.2模塊,叫“ModuleB”,在WebRoot目錄下新建文件夾“ModuleB”,配置struts-config-ModuleB.xml文件:
新建Form、Action and JSP,在用例中輸入“employee”,增加兩個屬性:empName、depName,在JSP選項卡中填寫“/ModuleA/empInfo.jsp”,點(diǎn)擊下一步,Path中填寫“/employee”,在Action Impl中選擇Use existing Action class,使用SwitchAction,直接finish掉。
修改empInfo.jsp文件源碼:<html:form action="/employee?prefix=/ModuleB&page=/showEmp.jsp">…。
在ModuleB文件夾中新建showEmp.jsp文件,修改showemp.jsp源碼為:<bean:write name="employeeForm" property="empName"/>。
在struts-config-ModuleA.xml文件中,增加一個Action,在用例中輸入“empInfo”,增加一個forward,name為“/empInfo.jsp”。在根目錄下的index.jsp文件中增加如下內(nèi)容:
5.提交表單到其他模塊(子模塊到子模塊):<br>
<html:link module="/ModuleA" page="/empInfo.do">鏈接到模塊(ModuleB)的empInfo.do</html:link><br>鏈接到ModuleA的一個Action,由該Action的forward轉(zhuǎn)發(fā)到empInfo.jsp頁面<br><p>
最后修改EmpInfoAction.java源碼:return mapping.findForward("empOK");
經(jīng)測試成功。
環(huán)境是 Eclipse3.2+MyEclipse5.0 struts 1.2.9的
在第一個測試就出錯了
<html:link module="/ModuleA" page="/index.jsp">1.鏈接到其他模塊(ModuleA)直接鏈接到頁面</html:link><br>適用于沒有和Action,ActionForm關(guān)聯(lián)的純JSP頁面<br><p>
能幫忙看看么? 是我的環(huán)境配置問題么?
下面是錯誤提示:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
org.apache.struts.taglib.TagUtils.pageURL(TagUtils.java:1070)
org.apache.struts.taglib.TagUtils.computeURLWithCharEncoding(TagUtils.java:449)
org.apache.struts.taglib.TagUtils.computeURLWithCharEncoding(TagUtils.java:311)
org.apache.struts.taglib.html.LinkTag.calculateURL(LinkTag.java:463)
org.apache.struts.taglib.html.LinkTag.doStartTag(LinkTag.java:341)
org.apache.jsp.index_jsp._jspx_meth_html_link_0(index_jsp.java:165)
org.apache.jsp.index_jsp._jspx_meth_html_html_0(index_jsp.java:123)
org.apache.jsp.index_jsp._jspService(index_jsp.java:73)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
這是index_jsp.java文件中出錯的那幾行:
71 out.write("\r\n");
72 out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
73 if (_jspx_meth_html_html_0(_jspx_page_context))
return;
out.write('\r');
out.write('\n');
} catch (Throwable t) {
.........
123 if (_jspx_meth_html_link_0(_jspx_th_html_html_0, _jspx_page_context))
.......
165 int _jspx_eval_html_link_0 = _jspx_th_html_link_0.doStartTag();
謝謝幫幫忙了..
<html:link module="/ModuleA" page="/index.jsp">1.鏈接到其他模塊(ModuleA)直接鏈接到頁面</html:link>
我分別建了ModuleB和ModuleC都沒問題,這種方式比較簡單,沒什么需要配的,配置Eclipse自己產(chǎn)生了,不知道你是哪錯了
每個Module的頁面放到以Module名稱的目錄中!!
如 把index.jsp放到一個ModuleB的目錄里
org.apache.struts.taglib.html.LinkTag.doStartTag(LinkTag.java:341)
這是<html:link>標(biāo)簽的地方出錯了..
我直接用<a> 就可以的運(yùn)行的.
標(biāo)簽庫的文件必須要在web.xml中聲明的么?
而且,在頁面上的<taglib>導(dǎo)入的問題, 工具生成的是:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>.
html 標(biāo)簽,基礎(chǔ)開始吧
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
我知道要用html的標(biāo)簽庫的..
我的意思是 有時候我也看見有:
<%@ taglib uri="/WEB-INF/tags-html.dtd" prefix="html"%>
這和這個
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
有什么區(qū)別的嗎?
謝謝你的幫忙了... 以后會常來看看
一,Web-INF下的Tld文件。
二,jar包中找
如果tld文件在WEB-Inf下面,則要在web.xml中配置。
如果在jar包中,此jar包要有一個WETA-INF文件,里面放tld文件。
Struts包里已經(jīng)有了tld文件,所以不用在web.xml中配置。
當(dāng)然再配也不錯
就這兩點(diǎn)把:)
應(yīng)該是在web.xml中配置的
如
<taglib>
<taglib-uri>自己起</taglib-uri>
<taglib-location>tld文件名如 mytag.tld</taglib-location>
</taglib>
uri="http://jakarta.apache.org/struts/tags-html"
是struts包中自帶的tld文件,中uri描述的字符串
非常感謝!