commons-beanutils-1.7.0.jar --------Java 反射和内省 API 包装器
commons-chain-1.1.jar ---提供了一个基于Java的框架和API来描述顺序的处
commons-digester-1.8.jar---用于分析 XML 配置文件的 XML 到 Java 对象映
commons-logging-1.0.4.jar ----各种日志 API 实现的包装器
struts-core-1.3.8.jar---核心包
struts-extras-1.3.8.jar----扩展包
struts-taglib-1.3.8.jar(标签库包)
2.定义login.jsp页面
<form action="${pageContext.request.contextPath}/login.do" method="post">
帐号<input type="text" id="userName" name="userName"><br>
密码<input type="password" id="passWord" name="passWord"><br>
<input type="submit" value="提交">
</form>
3.定义LoginForm
* 继承ActionForm
* ActionFormBean中属性的名称 必须和jsp页面表单组件中name属性的值相同
package com.xxc.form;
import org.apache.struts.action.ActionForm;
@SuppressWarnings("serial")
public class LoginForm extends ActionForm {
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;
}
}
4.定义LoginAction 要继承Action, 重写execute方法 注意execute中是HttpServletRequest参数而不是ServletRequest参数
package com.xxc.action;
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 com.xxc.form.LoginForm;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//由此可见ActionMapping是将当前action标签里的信息封装成了对象
System.out.println("Name--->"+mapping.getName());//loginForm
System.out.println("Type--->"+mapping.getType());//com.xxc.action.LoginAction
System.out.println("Path--->"+mapping.getPath());// /login
System.out.println("Scope--->"+mapping.getScope());//request
LoginForm loginform = (LoginForm)form;//进行强转
String userName = loginform.getUserName();
String passWord = loginform.getPassWord();
System.out.println("userName--->"+userName);
System.out.println("passWord--->"+passWord);
return mapping.findForward("success");<!--参数是当前action标签中forward自标签中的name属性-->
}
}
5.建立请求路径(/login.do和LoginAction中execute方法的联系,使用struts-cofig.xml搭建之间的联系
* struts-cofig.xml放置到WEB-INF下(也可以放在别的目录下,具体在web.xml中的 <servlet>标签中的<init-param>标签中配置路径)
* 配置struts-cofig.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>
<!--
配置ActionFormBean
* name属性:form-bean标签的唯一标识
* type属性:ActionFormBean所在的路径
-->
<form-beans>
<form-bean name="loginForm" type="com.xxc.form.LoginForm"></form-bean>
</form-beans>
<!--
action-mappings是action的集合
*path属性:是action标签的唯一表示
*type:表示ActionServlet中要实例化的action类路径
-->
<action-mappings>
<action path="/login" type="com.xxc.action.LoginAction" name="loginForm" scope="request"><!--name表示用哪个actionForm封装当前表单的数据的 -->
<forward name="success" path="/success.jsp"></forward>
</action>
</action-mappings>
</struts-config>
6.配置web.xml 将所有.do请求用ActionServlet进行拦截(需要在web.xml中进行servlet配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<servlet>
<!--
这个action是struts1提供的
*是struts1的中央控制器
*在目前的版本中只能配置一次ActionServlet
-->
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- 加载struts-config.xml文件 , 如果struts-config.xml在/WEB-INF/下,可以不配置 -->
<init-param>
<!-- param-name中config这个参数的名称是固定的 -->
<param-name>config</param-name>
<!-- param-name中config这个参数的名称是固定的 -->
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<!-- 服务器启动时就初始化这个servlet,数字越小越先加载 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<!-- 只要请求路径的后缀名是.do,就要访问struts的中央控制器ActionServlet -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
Struts1的工作流程:
1.服务器启动时,做的初始化工作:
* 在web.xml文件配置ActionServlet的映射
* 服务器启动时,实例化和初始化ActionServlet
* ActionServlet 初始化时,加载struts-config.xml文件
2.当客户端向服务器发送的请求的流程(以请求的路径/login.do为例) 这些都是struts1内部完成的工作
* 1 当客户端向服务器发送请求,请求的路径是/login.do,由于ActionServet接受请求路径的形式是*.do
所以该请求,将访问ActionServlet
* 2 ActionServlet接到请求后,解析请求路径/loginAction(去掉.do)
* 3 ActionServlet到struts-config.xml文件中查找action标签的path属性的值=/login,通过该对应关
系,找到Action标签,
* 4 ActionServlet把找到的Action标签中的信息封装到 Actionmapping对象中
* 5 ActionServlet在Action标签中查找name属性,根据name属性的值到form-beans表中查找用户封装表单数据的
ActinForm(LoginForm)
* 6 ActionServlet封装表单的数据到loginForm中.
* 7 ActionServlet在Action标签中查找type属性的值type=cn.itcast.web.action.LoginAction
* 8 ActionServlet为type=com.xxc.action.LoginAction创建实例
* 9 在ActionServlet调用action中execute方法(此时调用的是子类重写父类的方法),方法的返回值是
ActionForward对象, execute的四个参数
execute(4产生的ActionMapping对象,6产生ActionForm对象,HttpServletRequest对象,HttpServletResponse对象)
* 10 ActionServlet中利用ActionForward对象的getPath()方法,获取要转发的路径/success.jsp
* 11 在ActionServlet中 转发或者重定向
request.getRequestDispatcher("/success.jsp").forward(request, response);
RequestProcessor:
这个类是真正封装了struts控制器在处理servlet请求时所遵循的控制逻辑。也就是说servlet会调用RequestProcessor,
而不是将所有代码都写在ActionServlet中的。