刚接触到公司项目,我第一个看的文件时web.xml 因为他是整个web应用的配置文件.
<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>
</servlet-mapping>
总的入口就是ActionServlet
学习到目前为止,基本的流程已经摸清楚了
大概,第一步,浏览器,发起一个请求,比如localhost:8080/struts1/login.jsp
.里面只有简单的一个表单.内容如下:
<form action="<%=request.getContextPath() %>/login.do">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="submit" style="width: 86px; ">
</form>
可以看到提交的时候发起的url会是localhost:8080/struts1/login.do?username=demo&password=demo
(get请求)
tomcat收到http请求,将其交给struts1这个context容器.获取后缀是.do.将请求交给web.xml里面定义的ActionServlet.
ActionServlet会读取WEB-INF
目录下的struts-config.xml
内容如下:
<struts-config>
<form-beans>
<form-bean name="loginForm" type="org.qiao.form.LoginForm"/>
</form-beans>
<action-mappings>
<action path="/login" type="org.qiao.action.LoginAction"
name="loginForm">
<forward name="loginSuccess" path="/loginSuccess.jsp"></forward>
<forward name="loginError" path="/loginError.jsp"></forward>
</action>
</action-mappings>
</struts-config>
接着.do之前是/login.正好对应path="/login"
这个action.将请求交给action处理.这个action的类名就是org.qiao.action.LoginAction
.同时action还有name属性,这就会找name=loginForm
的其他元素,找到上面的<form-bean>
元素.这个元素定义javabean.就是实体类,但要和表单元素一一对应,否则会null.
public class LoginForm extends ActionForm{
private String username;
private String password;
geeter and setter method
}
将url后带的数据填充到LoginForm类中,生成一个LoginForm对象.将它作为参数,和ActionMapping request response,一起进入org.qiao.action.LoginAction类中默认的execute method中
public class LoginAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception{
LoginForm loginForm=(LoginForm)form;
String un=loginForm.getUsername();
String pw=loginForm.getPassword();
if(un!=""&&pw!=""&&un.equals("123")&&pw.equals("123")){
return mapping.findForward("loginSuccess");
}else{
return mapping.findForward("loginError");
}
}
}
将actionForm强转成自己的loginForm型,取出数据,做自己的逻辑判断. 最后要转发处理,显示结果,是成功还是失败,定义成功要转发到的页面,定义代号loginSuccess,失败loginError..代号在前面的action的配置文件中去获取,最终是转发到loginSuccess.jsp或者loginError.jsp页面.
整个历程中的字段对应关系就是这样.
流程图: