Struts1框架一之项目的配置及执行流程

首先,一个web项目,web.xml里面封装了所有的servlet、filter等信息,Struts1作为web框架,也需要通过xml的配置才能够运行
然后,struts1的servlet控制器是ActionServlet,所有的.do请求(也可以用其他的格式)信息都会通过该控制器转发到具体的Action里面
最后,我们来看看怎么在web.xml配置struts1的servlet中央控制器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>
        <!-- 这里就是配置struts1的ActionServlet所在的类路径  --!>
      <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
      <init-param>
          <!-- 配置struts的配置文件到actionServlet里面,这样调用ActionServlet就能知道访问struts里面的配置信息 -->
          <param-name>config</param-name>
            <!--这里是配置你项目的所有关于struts组件的相关信息--!>
          <param-value>/WEB-INF/struts-config.xml</param-value>
      </init-param>
      <init-param>
          <param-name>debug</param-name>
          <param-value>2</param-value>
      </init-param>
      <init-param>
          <param-name>detail</param-name>
          <param-value>2</param-value>
      </init-param>
      <!-- ActionServlet在服务器启动就创建 -->
      <load-on-startup>0</load-on-startup>
  </servlet>
<!--对所有的.do进行接收,说明所有的.do请求都会交给struts1的ActionServlet进行处理--!>
  <servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
<!--如果用户没有指定具体的路径,则服务器自动指定访问为index.jsp文件--!>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

上文讲解了怎么创建一个struts的项目,但是还不能用struts的组件,因为系统访问访问到.do请求交给ActionServlet请求,但是它并不知道你的请求具体交给谁进行处理,你的请求参数具体交给谁去封装,谁来使用。这就需要你这里的配置信息

这里指定的是,如果ActionServlet请求不知道交给谁去访问,就去查找config对应的路径文件,也就是:WEB-INF下的struts-config.xml文件,这里你可以对你的action、formBean等相关组件的信息进行配置

<?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>

    <!-- 配置所有的formbean,每个formbean都可以用一个<form-bean>类指定-->
    <form-beans>
        <form-bean name="Student_Bean" type="com.xingyao.bean.Student_Bean"></form-bean>
    </form-beans>

    <!-- 配置具体接受action请求的信息,每一个action请求都可以用一个<action>来指定 -->
    <action-mappings>
        <!-- 配置action信息,其中
            path表示用户form请求路径;
            type表示服务器组件action的类;
            name表示formBean组件;
            scope表示将FormBean封装到那个域中
            validate表示是否要验证该formBean:这个请查看后面formBean的validate()方法,会有具体的解释
         -->
        <action path="/login" type="com.xingyao.action.LoginAction" name="Student_Bean" scope="request" validate="false">
            <!-- 具体请求的时候,得到返回结果,需要跳转(转发)的页面 -->
            <forward name="success" path="/WEB-INF/JSP/success.jsp"></forward>
            <forward name="error" path="/WEB-INF/JSP/error.jsp"></forward>
        </action>
    </action-mappings>
</struts-config>

这就完成了一个action、formbean组件的配置,这些组件分别具体在的位置是type标签指定的,有就是说
action的具体类为:com.xingyao.action.LoginAction
formbean的具体类为:com.xingyao.bean.Student_Bean
接下来就开始写具体的组件类,我这里就直接贴出来
LoginAction的代码



package com.xingyao.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.xingyao.bean.Student_Bean;

/**
 * 登入功能的action
 * @author xingyao
 * @since 2016-8-24
 */
@SuppressWarnings("all")
public class LoginAction extends Action{

    /**
     * 接受到请求信息,执行下面的代码,完成用户功能
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //这个from就是接受到的表单信息,你可以直接进行强制转换
        Student_Bean student_Bean = (Student_Bean)form;
        //返回结果,拥有返回页面的判断,参照配置文件(struts-config.xml)里面的<forward name="success" path="/WEB-INF/JSP/success.jsp"></forward>
        return mapping.findForward("success");
    }
}
formBean的代码


package com.xingyao.bean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;


/**
 * 学生信息bean
 * @author xingyao
 * @since 2016-8-24
 */
public class Student_Bean extends ActionForm {

    private static final long serialVersionUID = 1223641177270461734L;

    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;
    }

    /**
     * 用于重置bean对象的信息,在收集表单数据之前就会被调用
     */
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        super.reset(mapping, request);
    }


    /**
     * 用于验证前台信息的格式正确性方法
     */
    public ActionErrors validate(ActionMapping mapping,
            HttpServletRequest request) {

        return super.validate(mapping, request);
    }
}

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html>
  <head>
    <base href="<%=basePath%>">
  </head>

  <body>
    <form action="login.do" method="post">
        <input type="submit" value="提交">
    </form>
  </body>
</html>

上面的讲解,让我们了解了怎么配置一个struts项目,现在我们来粗劣讲解下它的执行流程
是:来来来,来上课 好
还是:去去去,去上课 好?这是个问题!我在这里脑子抽风,请原谅我
1、当用户访问login.jsp的时候,点击提交!客户端就会发送login.do请求交给服务器
2、服务器接收到了.do请求,开始查找web.xml文件,发现所有的.do请求都交给org.apache.struts.action.ActionServlet这个servlet进行处理
3、它本身不能够处理,所以就只能通过配置文件struts-config.xml查找看是否有一个path=”/login”的action组件
4、如果没有则抛出
如果有则访问该组件
5、通过该组件的配置信息name属性来查找 组件里面同样name属性值相同的,通过type属性,我们就可以知道具体的容器封装该请求信息
6、找到了该请求封装的具体类,然后查找scope对应域调用getAttribute(“name的属性值”,Object)对象,如果有则取出该对象,采用具体容器模型封装请求参数信息,如果没有则创建该容器对象,存入scope对应的域,然后根据该对象模型进行数据的封装
7、如果validate=”true”还要在数据封装之前对数据的格式进行验证,具体的验证信息就是调用方法
这里写图片描述
8、根据type属性值得到具体的action类,然后调用里面的方法
9、然后就开始调用具体的action请求方法了,也就是LoginAction类里面的execute方法,这里会将请求参数信息封装到ActionForm里面,将action的配置信息放在ActionMapping对象里面,这样就开始执行里面的功能代码,需要返回一个ActionForward对象,用于根据返回信息和参照得到具体的返回页面的信息
另:
附件里面有我一个最简单关于struts项目的实现
转载请标明出处
感谢苏波老师的指导
个人见解、错误请指出!请莫怪

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值