Struts原理和struts1.x完整实例

时间:2021-11-21 22:01:50

struts1的工作原理图:

 

Struts原理和struts1.x完整实例

 

  1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的

            Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts

            中不同的模块初始化相应的对象。(面向对象思想)

  2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。

  3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员

              变量中。

  4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并

              传给这个Action中的excute()方法。

  5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)

              完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。

  6.返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。

  7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下

              为jsp页面。

  8.响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。


struts1的工作原理图:

客户端发送请求(Http Request),被struts1的核心控件器ActionServlet接收,ActionServlet根据struts-config.xml里的映射关系找到对就的Action,若找不到就返回500错误到JSP页面。若有就Action里的 excute()方法里执行相应的逻辑操作,比如调用Model层的方法,然后通过ActionForward,跳转到对应的输出页面

 

struts1的步骤:

1.导入struts1在lib文件下的所有架包;

2.把web-inf文件下的struts-config.xm文件复制到自己项目里面的web-inf下,把注释去掉只留下一对<struts-config>标签;

3.把web-inf文件下的web.xml文件里的servlet配置复制到自己项目里面的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>
    <load-on-startup>2</load-on-startup>
 </servlet>

4.创建有关的action类继承action重写他的execute方法;

5.根据所写的有关action类配置<struts-config>文件里的东西如:

<action-mappings>

<action path="/addUser"
  type="com.wangzhaohui.action.AddUserAction"
>

 <forward name="scuess" path="/ok.jsp"></forward> 
</action>

</action-mappings>

6.我们还可以写一个继承ActionForm的类,里面的写法和pojo类差不多,看需要接收哪些参数就写什么。配置好了就可来自动接收表单数据

<struts-config>

<form-beans>
<form-bean  name="userForm" type="com.wangzhaohui.actionForm.UserActionForm"></form-bean>
</form-beans>
<action-mappings>

<action path="/addUser"
  type="com.wangzhaohui.action.AddUserAction"
  name="userForm">
 <forward name="scuess" path="/ok.jsp"></forward> 
</action>

</action-mappings>

</struts-config>

然后在action里面接收数据的时候就可以用如form.getXX来自动接受表单数据了。

(view)视图层里面的.do请求都被actionservlet*控制器(在web.xml里面配置好的)接收到,会读取配置文件(srtuts-config)找到相应的请求,分发给相应的action进行处理。进行处理的时候需要传几个参数:request,response,mapping(把配置拿出来封装成一个对象取出来), 还有一个actionForm(根据配置文件里配置的name=“”来自动接收表单数据,最终调用业逻辑,拿到一些数据返回回来,返回actionservlet的是一个actionForward的跳转信息,通过mapping.findForward找到然后servlet里面它会帮你自动的挑战到相应的页面

struts1.x完整实例

1、简介

        struts是WEB程序MVC分层架构中的C,属于控制层,主要进行处理用户的请求,基于请求驱动。获取用户的请求地址并将表单中的数据封装到Form对象后交给Action进行处理。在Action中进行条用业务层处理具体的请求后将结果通过ActionMapping封装跳转地址返回给用户。struts是对servlet的再次封装,使得更加灵活高效。下面以一个登录的实例讲解struts的开发过程。

2、在新建的web工程中添加以下struts1.x  jar包

        antlr-2.7.6.jar、commons-beanutils.jar、commons-digester.jar、commons-fileupload.jar、commons-logging-1.0.4.jar、commons-validator.jar、jakarta-oro.jar、struts.jar。

3、web.xml进行如下配置

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>MyStruts1Prj</display-name>  
  4.     
  5.   <servlet>  
  6.     <servlet-name>action</servlet-name>  
  7.     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
  8.       
  9.     <init-param>  
  10.         <param-name>config</param-name>  
  11.         <param-value>/WEB-INF/conf/struts-config.xml</param-value>  
  12.     </init-param>  
  13.     <init-param>  
  14.         <param-name>debug</param-name>  
  15.         <param-value>3</param-value>  
  16.     </init-param>  
  17.     <init-param>  
  18.         <param-name>detail</param-name>  
  19.         <param-value>3</param-value>  
  20.     </init-param>  
  21.       
  22.     <load-on-startup>0</load-on-startup>  
  23.   </servlet>  
  24.     
  25.   <servlet-mapping>  
  26.     <servlet-name>action</servlet-name>  
  27.     <url-pattern>*.do</url-pattern>  
  28.   </servlet-mapping>  
  29.     
  30.   <welcome-file-list>  
  31.     <welcome-file>index.jsp</welcome-file>  
  32.   </welcome-file-list>  
  33. </web-app>  


4、新建登陆页面login.jsp

[html] view plaincopyprint?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <%  
  7.     String basePath = request.getContextPath();  
  8. %>  
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  10. <title>登陆页面</title>  
  11. </head>  
  12. <body>  
  13.     <h1>登陆页面</h1>  
  14.     <hr>  
  15.     <form action="<%=basePath %>/login.do" method="post" >  
  16.         userName:<input id="userName" name="userName" type="text" /><br>  
  17.         passWord:<input id="passWord" name="passWord" type="password" /><br>  
  18.         <input type="submit" id="submit" name="submit" value="submit" />  
  19.     </form>  
  20. </body>  
  21. </html>  


5、新建登陆成功后的跳转页面loginSucces.jsp

[html] view plaincopyprint?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>登陆成功页面</title>  
  8. </head>  
  9. <body>  
  10.     <h1>欢迎[<%=request.getAttribute("userName") %>]登陆成功!</h1>  
  11. </body>  
  12. </html>  


6、新建登陆失败后的跳转页面loginError.jsp

[html] view plaincopyprint?
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>登陆失败页面</title>  
  8. </head>  
  9. <body>  
  10.     <h1>登陆失败!</h1>  
  11. </body>  
  12. </html>  


7、新建LoginActionForm.java

[java] view plaincopyprint?
  1. package com.lanp.webapp.form;  
  2.   
  3. import org.apache.struts.action.ActionForm;  
  4.   
  5. /** 
  6.  * 封装登陆表单数据的FORM类 
  7.  * @author LanP 
  8.  * @since 2012年4月11日23:07:09 
  9.  * @version v1.0 
  10.  */  
  11. @SuppressWarnings("serial")  
  12. public class LoginActionForm extends ActionForm {  
  13.     private String userName;  
  14.       
  15.     private String passWord;  
  16.       
  17.     public String getUserName() {  
  18.         return userName;  
  19.     }  
  20.     public void setUserName(String userName) {  
  21.         this.userName = userName;  
  22.     }  
  23.     public String getPassWord() {  
  24.         return passWord;  
  25.     }  
  26.     public void setPassWord(String passWord) {  
  27.         this.passWord = passWord;  
  28.     }  
  29. }  


8、新建LoginAction.java

[java] view plaincopyprint?
  1. package com.lanp.webapp.action;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.apache.struts.action.Action;  
  7. import org.apache.struts.action.ActionForm;  
  8. import org.apache.struts.action.ActionForward;  
  9. import org.apache.struts.action.ActionMapping;  
  10.   
  11. import com.lanp.webapp.form.LoginActionForm;  
  12. /** 
  13.  * 处理登陆的Action类 
  14.  * @author LanP 
  15.  * @since 2012年4月11日23:07:09 
  16.  * @version v1.0 
  17.  */  
  18. public class LoginAction extends Action {  
  19.   
  20.     @Override  
  21.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  22.             HttpServletRequest request, HttpServletResponse response)  
  23.             throws Exception {  
  24.         String path = "error";  
  25.         LoginActionForm loginActionForm = (LoginActionForm)form;  
  26.         String userName = loginActionForm.getUserName();  
  27.         String passWord = loginActionForm.getPassWord();  
  28.           
  29.         if(null != userName && "admin".equals(userName) && null != passWord && "admin".equals(passWord)) {  
  30.             path = "success";  
  31.             request.setAttribute("userName", userName);  
  32.         } else {  
  33.             path = "error";  
  34.         }  
  35.         return mapping.findForward(path);  
  36.     }  
  37.       
  38. }  


9、配置struts-config.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">  
  3.   
  4. <struts-config>  
  5.     <form-beans>  
  6.         <form-bean name="loginActionForm" type="com.lanp.webapp.form.LoginActionForm">  
  7.         </form-bean>  
  8.     </form-beans>  
  9.   
  10.     <action-mappings>  
  11.         <action path="/login"  
  12.             type="com.lanp.webapp.action.LoginAction"  
  13.             name="loginActionForm"  
  14.             scope="request">  
  15.             <forward name="success" path="/jsp/loginSucces.jsp" />  
  16.             <forward name="error" path="/jsp/loginError.jsp" />  
  17.         </action>  
  18.     </action-mappings>  
  19. </struts-config>