入職兩周了,項目是用struts1+ibatis框架搭建的,數據庫是oracle,其他還行,關鍵是struts1之前沒用用過,所以只好在網上狂查文檔,最后大致整理了一些struts1的基本使用方法。
首先struts1需要引入的jar包:
因為我的IED是Myeclipse8.5直接引入的,實在是不想在struts的網站找jar了
struts1和2的第一個區別就是xml配置的位置不一樣,struts1的配置文件是放在webRoot/WRB-INF/ib下,叫做struts-config.xml
基本格式是:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans /> <global-exceptions /> <global-forwards /> <action-mappings /> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> </struts-config>
<form-beans />:配置bean的
<action-mappings />:配置action,和2中的<action>差不多
web.xml中的配置:
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
總的來說struts1就是一個大的servlet,在接收到request這個大的servlet就分配給對應的servlet,這個總的servlet隱藏在幕后,一般不用動,因為這里只是介紹怎么最基本的使用struts1,因為畢竟還是有一些公司的殘余項目再用。如代碼所示,這個servlet攔截所有的*.do的請求。
頁面有3個,一個index.jsp,success.jsp,failuer.jsp,index.jsp有一個表單,后台做驗證,如果用戶名是jackie,密碼是111111就跳轉到success.jsp,不是的話就跳轉到failuer.jsp.index.jsp的表單如下所示
<form action="check.do" method="post"> username:<input type="text" name="username"> <br/>password:<input type="password" name="password"> <br/> <input type="submit" value="submit"> </form>
其實有<html:text>的標簽,但是我不喜歡用,因為標簽實在是記不過來,而且我一直在想,如果不用jsp改用html怎么辦,所以我個人比較喜歡最原生的標簽
success.jsp:
<body> check success!!! <br> </body>
如果用戶名為jackie,密碼為111111就跳轉到這個頁面
failuer.jsp:
<body> check failuer!!! <br> </body>
驗證錯誤就跳轉到failuer.jsp頁面
好了,前台的頁面寫好了,就是后台了
首先,既然是框架,無論是否是古老的struts1,那么我最關心的就是他可不可以幫我封裝一個bean,
我們先自己寫一個user對象,這樣struts1就可以幫助我們封裝
package com.xiaoxia.form; import org.apache.struts.action.ActionForm; public class User extends ActionForm{ /** * */ private static final long serialVersionUID = 1L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
struts1中的bean與2不同,必須繼承一個叫ActionForm的類,其他的和2一樣,屬性私有,提供get和set的方法。
其次,我們來寫一個處理方法的類
Mycheck.java
package com.yourcompany.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import org.apache.struts.actions.ForwardAction; import com.xiaoxia.form.User; public class Mycheck extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //先把form轉換成User的實體bean User user = (User) form; //做邏輯判斷,如果輸入合法,那么尋找一個success的forward if(user.getUsername().equals("jackie") && user.getPassword().equals("111111")){ return mapping.findForward("success"); } //輸入非法,尋尋找一個failuer的forward return mapping.findForward("failuer"); } }
其中繼承了struts1中一個叫Action的類,做處理的方法名字必須是execute,四個參數中,一個是mapping,主要是處理完后跳轉用的,ActionForm是struts1中幫助我們封裝的實體bean,剩下的request和response和servlet中的一樣。
java代碼寫完了,最后得配置struts的配置xml,如圖所示
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <data-sources /> <form-beans> <form-bean name="user" type="com.xiaoxia.form.User"></form-bean> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action name="user" path="/check" type="com.yourcompany.struts.Mycheck" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> <forward name="failuer" path="/failuer.jsp" /> </action> </action-mappings> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> </struts-config>
其中在<form-beans>中配置相對應的實體bean,name是配置文件中實體bean的名字,type是對應的java類
<action-mappings>中配置對應的action,可以配置多個action,一個action對應一個action的標簽,這里只配置一個,<action>中,name對應的是要使用的實體bean
path是對應的路徑,在index.jsp中的form表單中的action就是“check.do”
type是對應的做處理的類
scope是使用的范圍,validate是驗證,通過驗證才會調用相應的方法,但是現在前台驗證一般都是js,所以這個屬性估計沒太大用
下面的子標簽<forward>就是跳轉的頁面,那么是對應的名字,在java代碼中就是mapping.findForward(".....")中間就是<forward>中對應的名字
其他的就不一一介紹了。這樣一個demo的項目就可以開始跑了
關鍵是比較蛋疼的問題還有一個,就是如果我想規定它跳轉到某個具體方法該怎么辦(處女座的強迫症模式開啟……)
其實也很簡單,但是網上例子真心沒找到,這里總結下,首先,你的Mycheck.java必須集成另一個類叫DispathAction,然后你就可以改名字了
package com.yourcompany.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; import org.apache.struts.actions.ForwardAction; import com.xiaoxia.form.User; public class Mycheck extends DispatchAction { public ActionForward mycheck(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //先把form轉換成User的實體bean User user = (User) form; //做邏輯判斷,如果輸入合法,那么尋找一個success的forward if(user.getUsername().equals("jackie") && user.getPassword().equals("111111")){ return mapping.findForward("success"); } //輸入非法,尋尋找一個failuer的forward return mapping.findForward("failuer"); } }
其次,你必須在struts-config.xml的action中加一個屬性:parameter
<action name="user" path="/check" type="com.yourcompany.struts.Mycheck" parameter="operate" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> <forward name="failuer" path="/failuer.jsp" /> </action>
parameter中隨意指定,但是必須在提交過來的參數中有一個參數名為operate,相應的值對應方法名
2015-05-10 17:44:42