action mapping中的attribute 屬性到底是干什么用的, 很早以前一直不太了解,今天突然又想到了這個(gè)問題,感覺不能再扔一邊不管了, 一定要解決它.
這是在網(wǎng)上查到的關(guān)于attribute的解釋.
1)應(yīng)用前提,attribute只有在設(shè)置了name后才有意義。
2)attribute可以實(shí)現(xiàn)對(duì)象的重用,即如果設(shè)置了attribute屬性,在創(chuàng)建actionform是,會(huì)先去查找相應(yīng)的scope中是否有此對(duì)象,如果有,則重用,否則創(chuàng)建新的對(duì)象。
3)當(dāng)你將創(chuàng)建的acitonForm保存到相應(yīng)的scope中時(shí),你想用一個(gè)更有意義的名字來訪問它時(shí),它就有意義了。
可是,看到"一個(gè)更有意義的名字的時(shí)候", 我好像有點(diǎn)理解了
<action
attribute="newLoginForm"
name="loginForm"
type="loginAction"
scope="request"
path="/login">
在struts實(shí)例化actionform的時(shí)候,struts是根據(jù)attribute的值來查找并創(chuàng)建actionform,有兩種情況:如果已經(jīng)存在,那么從內(nèi)存中取回;如果第一次實(shí)例化,那么創(chuàng)建,并放入內(nèi)存。
org.apache.struts.util.RequestUtils中的源代碼
???public static Actionform createActionform(
? ? ? ?HttpServletRequest request,
? ? ? ?ActionMapping mapping,
? ? ? ?ModuleConfig moduleConfig,
? ? ? ?ActionServlet servlet) {
?????? ............
??????............
???????String attribute = mapping.getAttribute();
??????......
???????Actionform instance = null;
? ? ? ?HttpSession session = null;
???????if ("request".equals(mapping.getScope())) {
? ? ? ? ? ?instance = (Actionform) request.getAttribute(attribute);
? ? ? ?} else {
? ? ? ? ? ?session = request.getSession();
? ? ? ? ? ?instance = (Actionform) session.getAttribute(attribute);
? ? ? ?}
??????................
????????................
???????
???????}
???????
如果沒有配置attribute屬性的話, struts才會(huì)從name屬性里讀出要?jiǎng)?chuàng)建的formbean 的名字,并創(chuàng)建一下實(shí)例,看下邊的源代碼就知道了, 呵呵.
org.apache.struts.config.ActionConfig
???protected String attribute = null;
? ?public String getAttribute() {
?//就是這里了.
???????if (this.attribute == null) {
? ? ? ? ? ?return (this.name);
? ? ? ?} else {
? ? ? ? ? ?return (this.attribute);
? ? ? ?}
? ?}
? ?public void setAttribute(String attribute) {
? ? ? ?if (configured) {
? ? ? ? ? ?throw new IllegalStateException("Configuration is frozen");
? ? ? ?}
? ? ? ?this.attribute = attribute;
? ?}