<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在請求應用時,struts2將會截獲所有請求,對于servlet請求將不能夠正常相應,是struts2把servlet當成act
解決方法目前有四種:
方法1:統(tǒng)一在servlet后面加上.servlet(包括web.xml配置文件中和頁面上使用servlet的地方)
方法2:繼承StrutsPrepareAndExecuteF
public void init(FilterConfig filterConfig) throws
ServletException {
..............................
}
public void doFilter(ServletRequest request,
ServletResponse response,
IOException, ServletException {
if(url.contain("servlet")){
((HttpServletResponse) response).sendRedirect(redirectUrl);
}
super.doFilter(request, response, chain);
}
方法3:修改攔截頁面配置
原:
<filter>
/* </url-pattern>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.act
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
<filter-name>struts2</filter-name>
<url-pattern>/user/*</url-pattern>
servlet的請求路徑不必改變
方法4:在struts.xml文件中修改
……
<s:set name="post" value="@edu.mobile.company.function.GetJobPost@getJobHTML()" />
${post}
這樣就能在表示頁面顯示出來。
但是還有一種情況就是需要調(diào)用一個含有參數(shù)的靜態(tài)方法怎么辦?
在網(wǎng)上找了N久,都無果,最后查閱相關OGNL文檔,嘗試能使用下面方法可行:
來源:(http://blog.sina.com.cn/s/blog_553d5e730100egr7.html) - STRUTS2 標簽調(diào)用靜態(tài)方法_roteson_新浪博客<s:set name="post" value="@edu.mobile.company.function.GetJobPost@getJobHTML(#session.username)" />
${post}
<s:set name="job" value="#session.jobdata" />
<s:set name="post" value="@edu.mobile.company.function.GetJobPost@getJobHTML(#job)" />
${post}
struts2.0的標簽庫(簡介)
用過struts1.x的人都知道,標簽庫有html、bean、logic、tiles,
而struts2.0里的標簽卻沒有分類,只用在jsp頭文件加上
<%@ taglib prefix="s" uri="/struts-tags" %>
就能使用struts2.0的標簽庫
下面就介紹下每個標簽的用法(有錯請指正):
A:
<s:a href=""></s:a>-----超鏈接,類似于html里的<a></a>
<s:action name=""></s:action>-----執(zhí)行一個view里面的一個action
<s:actionerror/>-----如果action的errors有值那么顯示出來
<s:actionmessage/>-----如果action的message有值那么顯示出來
<s:append></s:append>-----添加一個值到list,類似于list.add();
<s:autocompleter></s:autocompleter>-----自動完成<s:combobox>標簽的內(nèi)容,這個是ajax
B:
<s:bean name=""></s:bean>-----類似于struts1.x中的,JavaBean的值
C:
<s:checkbox></s:checkbox>-----復選框
<s:checkboxlist list=""></s:checkboxlist>-----多選框
<s:combobox list=""></s:combobox>-----下拉框
<s:component></s:component>-----圖像符號
D:
<s:date/>-----獲取日期格式
<s:datetimepicker></s:datetimepicker>-----日期輸入框
<s:debug></s:debug>-----顯示錯誤信息
<s:div></s:div>-----表示一個塊,類似于html的<div></div>
<s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----雙下拉框
E:
<s:if test=""></s:if>
<s:elseif test=""></s:elseif>
<s:else></s:else>-----這3個標簽一起使用,表示條件判斷
F:
<s:fielderror></s:fielderror>-----顯示文件錯誤信息
<s:file></s:file>-----文件上傳
<s:form action=""></s:form>-----獲取相應form的值
G:
<s:generator separator="" val=""></s:generator>----和<s:iterator>標簽一起使用
H:
<s:head/>-----在<head></head>里使用,表示頭文件結(jié)束
<s:hidden></s:hidden>-----隱藏值
I:
<s:i18n name=""></s:i18n>-----加載資源包到值堆棧
<s:include value=""></s:include>-----包含一個輸出,servlet或jsp頁面
<s:inputtransferselect list=""></s:inputtransferselect>-----獲取form的一個輸入
<s:iterator></s:iterator>-----用于遍歷集合
L:
<s:label></s:label>-----只讀的標簽
M:
<s:merge></s:merge>-----合并遍歷集合出來的值
O:
<s:optgroup></s:optgroup>-----獲取標簽組
<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右選擇框
P:
<s:param></s:param>-----為其他標簽提供參數(shù)
<s:password></s:password>-----密碼輸入框
<s:property/>-----得到'value'的屬性
<s:push value=""></s:push>-----value的值push到棧中,從而使property標簽的能夠獲取value的屬性
R:
<s:radio list=""></s:radio>-----單選按鈕
<s:reset></s:reset>-----重置按鈕
S:
<s:select list=""></s:select>-----單選框
<s:set name=""></s:set>-----賦予變量一個特定范圍內(nèi)的值
<s:sort comparator=""></s:sort>-----通過屬性給list分類
<s:submit></s:submit>-----提交按鈕
<s:subset></s:subset>-----為遍歷集合輸出子集
T:
<s:tabbedPanel id=""></s:tabbedPanel>-----表格框
<s:table></s:table>-----表格
<s:text name=""></s:text>-----I18n文本信息
<s:textarea></s:textarea>-----文本域輸入框
<s:textfield></s:textfield>-----文本輸入框
<s:token></s:token>-----攔截器
<s:tree></s:tree>-----樹
<s:treenode label=""></s:treenode>-----樹的結(jié)構(gòu)
具體解決辦法 :在myEclipse中改變編譯器的方法
Window->Proerence->MyEclipse->Servers->Tomcat->Tomcat 6.x->JDK ,
在Tomcat JDK name中選擇jdk1.6.0
PS:因為Tomcat6.0需要jdk1.6.0以上版本支持 , 但是MyEclipse6.0的jdk版本是5.0 的, 所以會出現(xiàn)這個異常。
另外還有個地方最好也要設置最新版本JDK,
Window->Proerence->Java->Installed JARs->JDK .在這里可以添加需要的Jdk。
與Servlet API解耦的訪問方式(IoC方式)
為了避免與Servlet API耦合在一起,方便Action類做單元測試,Struts 2對HttpServletRequest、HttpSession和ServletContext進行了封裝,構(gòu)造了三個Map對象來替代這三種對象, 在Action中,直接使用HttpServletRequest、HttpSession和ServletContext對應的Map對象來保存和讀取 數(shù)據(jù)。
要獲取這三個Map對象,可以使用com.opensymphony.xwork2.ActionContext類,ActionContext 是action執(zhí)行的上下文,在ActionContext中保存了action執(zhí)行所需的一組對象,包括parameters、request、 session、application和locale等。ActionContext類定義了如下方法,用于獲取 HttpServletRequest、HttpSession和ServletContext對應的Map對象。
ActionContext類沒有提供類似getRequest()這樣的方法來獲取封裝了HttpServletRequest的Map對象。要得到請求Map對象,你需要為get()方法傳遞參數(shù)“request”。
獲取封裝了HttpSession的Map對象。
獲取封裝了ServletContext的Map對象。
我們看 通過ActionContext來獲取request、session和application對象的LoginAction1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package action; import java.util.Map; import dbPackage.User; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; public class LoginAction1 implements Action { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @SuppressWarnings("unchecked") @Override public String execute() throws Exception { if("zhangsan".equals(user.getUsername())&& "1234".equals(user.getPassword())) { ActionContext context = ActionContext.getContext(); Map request = (Map)context.get("request"); Map session = context.getSession(); Map application = context.getApplication(); //在請求中放置歡迎信息。 request.put("greeting", "歡迎您來到程序員之家"); //在session中保存user對象 session.put("user", user); //統(tǒng)計用戶訪問量,在application中保存用戶訪問量數(shù)據(jù) Integer count = (Integer)application.get("counter"); if(null == count) count=1; else count++; application.put("counter", count); return SUCCESS; }else { return ERROR; } }} |
在成功頁面中,可以使用JSP內(nèi)置的表達式語言來訪問request、session和application范圍的數(shù)據(jù),代碼如例3-12所示。
例3-12 success.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<%@ page contentType="text/html;charset=GBK" %> <html> <head><title>歡迎頁面</title></head> <body> <h3>${sessionScope.user.username},${requestScope.greeting}。<br> 本站的訪問量是:${applicationScope.counter}</h3> </body> </html> |
與Servlet API耦合的訪問方式(非IoC方式)
要獲得上述對象,關鍵Struts 2.0中com.opensymphony.xwork2.ActionContext類。我們可以通過它的靜態(tài)方法getContext()獲取當前 Action的上下文對象。 另外,org.apache.struts2.ServletActionContext作為輔助類(Helper Class),可以幫助您快捷地獲得這幾個對象。
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想訪問session的屬性(Attribute),你也可以通過ActionContext.getContext().getSession()獲取或添加session范圍(Scoped)的對象。
本文轉(zhuǎn)載于:http://www.emool.cn/archives/y2009/318.html