构建Struts1.x项目
一、搭建环境
1.导入jar包(本人下载的是struts-1.3.10-all.zip),将里面struts的lib目录下的jar包全部导入。
2.在WEB-INF下建立一个配置文件:struts-config.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<!-- 让Struts知道LoginForm,提供给Action使用 ,name为Form的引用名,type为所对应的Form类的全名-->
<form-bean name="loginForm" type="cn.itcast.LoginForm"></form-bean>
<form-bean name="addStudentForm" type="cn.itcast.AddStudentForm"></form-bean>
</form-beans>
<!-- <action-mappings>元素帮助进行框架内部的流程控制,可将请求URI眏射到Action类,将Action对象与ActionForm对象相关联。<action-mappings>元素可定义多个<action>子元素 -->
<action-mappings>
<!-- <action>所描述的是特定的请求路径和一个相应的Action类之间的映射关系。有以下属性:
attribute:设置和Action关联的form bean在request/session内的属性key,通过request/session的getAttribute(attribute)方法返回该 form bean实例。
input:当表单验证失败时将请求转发的URL,如果 表单校验不通过则跳转到到该值所代表的目标模块 -->
<!-- 配置Action,path为ActionServlet能够找到LoginAction,type为Action的类的全名,name指明ActionServlet所用的Form(即用来存放表单提交过的的值的Form,没有的话会将空指针异常) -->
<action path="/login" type="cn.itcast.LoginAction" name="loginForm">
<!-- forward实现跳转 ,name指定跳转方式,path指定跳转页面,相当于键值对-->
<forward name="loginSuccess" path="/LoginSuccess.jsp"></forward>
<forward name="loginFailure" path="/LoginFailure.jsp"></forward>
</action>
<action path="/addStudentAction" type="cn.itcast.AddStudentAction" name="addStudentForm" scope="request" validate="true" attribute="addStudentForm1" input="/ErrorInput.jsp">
<forward name="addStudentSuccess" path="/AddStudentSuccess.jsp"></forward>
<forward name="addStudentFailure" path="/AddStudent.jsp"></forward>
</action>
<!-- *代表通配符,在{1}出现的地方和前面的*保持一至,这可以用于配置一类类似的文件名。path和type为action必须配置的参数,validate表示在填充Form时是否需要校验,默认值为true表示需要校验。input是校验不通过后返回的页面。-->
<action path="/Edit*"
type="org.apache.struts.webapp.example.Edit{1}Action"
name="{1}Form"
scope="request"
validate="false">
<forward name="sucess" path="/{1}.jsp/">
</action>
<action path="/Save*"
type="org.apache.struts.webapp.example.Save{1}Action"
name="{1}Form"
scope="request"
<set-property property="cancellable" value="true"/>
</action>
</action-mappings>
<!-- 全局跳转,当有两个或两个以上的Action要跳到同一个页面时使用 -->
<global-forwards>
<forward name="error" path="/Error.jsp"/>
</global-forwards>
</struts-config>
3.web.xml中注册struts中心控制器--ActionServlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<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>
<load-on-startup>0</load-on-startup><!-- 服务一启动时就进行实例化 -->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern> <!--让所有的*.do的请求都进这里-->
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、那立一个类,继承ActionForm:package cn.itcast;
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm {
private String username=null;
private String password=null;
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;
}
}
注册修改配置文件struts-config.xml
见上。
三、开发Action:
1.建立一个类,继承Action,覆盖execute方法,需要强制转型:
package cn.itcast;
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;
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 继承父类(父类会将表单提交的值放在form中传递过来),调用LoginForm来存放表单传送过来的值(即将form强转为LoginFrom )
LoginForm loginForm=(LoginForm)form;
// 从LogginForm中将值取出来业务逻辑处理
String returnURLKeyWord="";
if(loginForm.getUsername().equals("itcast")){
returnURLKeyWord="loginSuccess";
}else{
returnURLKeyWord="loginFailure";
}
// 通过使用struts-config.xml配置的父类(先带着跳转方式跳转到ActionServlet再由ActionServlet选择跳转页面 )实现跳转
return mapping.findForward(returnURLKeyWord);
}
}
注册,修改配置文件struts-config.xml
见上。
四、界面JSP
<body>
<!-- request.getContextPath():工程上下文,login.do中login是从struts-config.xml下action中的path中拷贝过来的 -->
<!-- form表单提交给login.do,进入前端控制器ActionServlet(web.xml:*.do)然后再转入后端控制器LoginAction(struts-config.xml:login) -->
<form action="<%=request.getContextPath() %>/login.do" method="post">
<!-- 各表单控件的name属性必须和提交后的Form中的属性名一至,否则会出现空指针异常 -->
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="login"><br>
</form>
</body>
五、注意事项
1、Action是单实例和线程不安全的,在Action中最好不要有可读写的变量。
2、struts-config.xml文件中的<action>元素的path属性中没有.do,原因是映射到struts的路径可以不是.do的,是不是.do还是.htm什么的由web.xml决定,因此设计时要考虑当web.xml中的配置可以动态更改的问题。
3、struts-config.xml文件中的<action>元素的path属性必须以“/”开头,forward中配置的jsp文件路径也必须以“/”开头,总之,在web应用程序中记住路径总是以“/”开头,就错不了!