今天写一个简单的Struts+Spring例子。目前来说,很少有项目单独用一个框架的,Struts+Spring,这个应该是做Web开发的人都要学的。这段时间学了不少框架的知识,来写一个简单的先。
环境:jdk1.5, Eclipse3.2, Tomcat5.5, struts1.0, spring1.2。所有struts的tld文件放在WEB-INF\tld下。
这个例子还是简单的登录,如果用户名为"Jim"而且密码为"111"的话就显示出一些消息,否则就跳转到登录错误页面。这个例子我没有写关于验证的东西,有兴趣的朋友可以参照我以前写的验证例子。
首先,我们来配置WEB-INF下的web.xml:
<?
xml version="1.0" encoding="UTF-8"?><!
DOCTYPE web-appPUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN""http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"
><
web-app> <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>0</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-logic</taglib-uri> <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location> </taglib></
web-app>这个跟以前的web.xml并没有什么不同。然后我们来写struts-config.xml:
<?
xml version="1.0" encoding="UTF-8"?><!
DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"><
struts-config> <data-sources /> <form-beans> <form-bean name="loginForm" type="src.LoginForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings> <action path="/login" name="loginForm" input="/login.jsp" type="org.springframework.web.struts.DelegatingActionProxy"> <forward name="success" path="/success.jsp" /> <forward name="failure" path="/failure.jsp" /> </action> </action-mappings> <message-resources parameter="src.ApplicationResource" /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in></
struts-config>注意,最后的plug-in里面说明了我们要用到spring的ContextLoaderPlugin,这个是用来分配不同的请求给不同的struts的action的,配置文件在value里面设置。我们这里就用到了一个ActionForm和一个Action,同时要注意,action-mapping里面,type改为了org.springframework.web.struts.DelegatingActionProxy,就是action的分发交由spring的DelegatingActionProxy代管。
然后写一个login.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><%@
taglib uri="/tags/struts-html" prefix="html" %><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Login Page</title></
head><
body><
center><
b>Login if you want to see your information</b><br/><
html:form. action="/login.do" method="post"> <table> <tr> <td>Username:<html:text property="username" /></td> <td><html:errors property="username" /></td> </tr> <tr> <td>Password:<html:password property="password" /></td> <td><html:errors property="password" /></td> <tr> <tr> <td align="center"><html:submit value="Login" /></td> </tr> </table></
html:form></
center></
body></
html>这里只需要输入username和password两个内容就可以了。
然后写LoginForm.java:
package
src;import
org.apache.struts.action.ActionForm;public
class LoginForm. extends ActionForm{ private String username; private String password; public String getPassword() { return password;}
public void setPassword(String password) { this.password = password;}
public String getUsername() { return username;}
public void setUsername(String username) { this.username = username;}
}
这里就只有刚刚login.jsp里面的username和password两个属性。
在这个例子里面,如果登录成功要显示一些个人信息,我们先写一个User.java:
package
src;public
class User { private String name; private int age; private String status; public User(){}
public int getAge() { return age;}
public void setAge(int age) { this.age = age;}
public String getName() { return name;}
public void setName(String name) { this.name = name;}
public String getStatus() { return status;}
public void setStatus(String status) { this.status = status;}
}
只有name, age, status三个属性。
接着我们来写WEB-INF下的applicationContext.xml,这个就是你要配置的spring的分发管理文件:
<?
xml version="1.0" encoding="UTF-8"?><!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><
beans> <bean name="/login" class="src.LoginAction" > <property name="user"> <ref local="user" /> </property> </bean> <bean id="user" class="src.User"> <property name="name"> <value>Jim Allen Green</value> </property> <property name="age"> <value>19</value> </property> <property name="status"> <value>Good</value> </property> </bean></
beans>这里的第一个bean,就相当于在struts-config.xml里面action-mapping中,我们将path="/login"的请求对应到了这里的name="/login",然后由哪个Action处理则由后面的class来指定。我们先看看LoginAction.java:
package
src;import
javax.servlet.http.*;import
org.apache.struts.action.*;public
class LoginAction extends Action{User
user; public ActionForward execute(ActionMapping mapping,ActionForm. form,
HttpServletRequest request,
HttpServletResponse response){
LoginForm. lf = (LoginForm)form;
HttpSession session = request.getSession();
String username = lf.getUsername();
String password = lf.getPassword();
ActionForward forward;
if(username.equals("Jim")&& password.equals("111")){session.setAttribute(
"User", user);forward = mapping.findForward(
"success");}
else{forward = mapping.findForward(
"failure");}
return forward;}
public User getUser() { return user;}
public void setUser(User user) { this.user = user;}
}
在这个Action里面,我们写了一个User类的user实例,就是说如果登录通过,那么会把该user放到一个名为User的session里面而后显示user的相关信息,也就是name, age, status三个属性。那么,这三个属性是怎么得到的呢?回过头来看applicationContext,第二个bean就写了这个user的相关信息。同时第一个bean里面有一个property属性,该属性里面的user就是指Action里面的这个user实例,并且将它参考到了第二个bean。这就是spring的IoC了。
然后写一个success.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><%@
taglib uri="/tags/struts-bean" prefix="bean" %><%@
taglib uri="/tags/struts-logic" prefix="logic" %><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Success Page</title></
head><
body><
center><
logic:present name="User">Name:
<bean:write name="User" property="name" /><br/>Age:
<bean:write name="User" property="age" /><br/>Status:
<bean:write name="User" property="status" /><br/></
logic:present><
a href="login.jsp">Back to Index</a></
center></
body></
html>这里用struts的标签显示出了相关信息。
再写一个failure.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Failure Page</title></
head><
body><
center>Failed to login!
<br/><
a href="login.jsp">Login again</a></
center></
body></
html>如此,这个简单的例子就完成了。当然,这个例子不够规范,太简单了,像验证username和password是否为正确的用户名和密码的过程是不应该放在LoginAction里面做的。这里只是尽可能写得简单一点。Struts+Spring能够使你的WEB开放简单、轻松。还有很多东西要学,大家有兴趣一起交流。