层层递进Struts1(二)之Struts1简介及登录实例

来源:互联网 发布:珠海设计院使用软件 编辑:程序博客网 时间:2024/06/09 12:27

    上篇博客由Servlet的几个版本的例子,引出在页面跳转控制方面要解决的问题,在文章最后提到了Struts1,这篇文章目的是解释一下什么是Struts1,及如何使用的问题。

    什么是Struts1

    说一下我的理解:它符合MVC思想,使用Java二次开发封装的一个框架,主要简化、解决页面请求分发、跳转的问题。Stuts1的优点是使用了丰富的配置文件使得灵活性大大提高;因为已经封装成框架,使得缩短了开发时间、提高了开发效率,同时适量使用抽象,使得代码冗余减低、文件冗余减少,维护更加简单。

    Struts1各个部件的相互作用如下:  

    

    它是一个开源项目,我们可以深入到框架的源码中,进一步理解Struts1并学习其开发、封装的思想,非常利于编程能力的提升。

    登录实例

    首先来看一下一个完整的struts1的登录实例,通过这个实例中涉及到的Struts1组成,来解释这些组成,并说明Struts1执行的流程。

    文件树

    

    login.jsp

    简单的登录验证界面,仅验证用户名和密码。
    
  <form action="login.do" method="post">  用户:<input type="text" name="username" /><br/>  密码:<input type="text" name="password" /><br/>  <input type="submit" value="提交"/>  </form>

    LoginActionForm

    封装使用到的用户名和密码信息,和三层中的实体作用了类似,这个在以后的文章中会详细说明。
package com.tgb.struts1;import org.apache.struts.action.ActionForm;/***** * 收集表单数据 * 表单属性值必须和get/set相对应 * @author Administrator * */@SuppressWarnings("serial")public class LoginActionForm 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;}}

    LoginAction

    用于跳转请求的逻辑处理和跳转指向,此处一直跳转到success标签中,从下面的配置文件中,可以看到success代表的是login_success.jsp。
package com.tgb.struts1;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.swing.ActionMap;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;/**** * 调用业务逻辑,返回转向信息 * @author Administrator * */public class LoginAction extends Action {@Overridepublic ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception{LoginActionForm laf=(LoginActionForm)form;String username=laf.getUsername();String password=laf.getPassword();UserManager userManager=new UserManager();try {userManager.login(username, password);} catch (UserNotFoundException e) {e.printStackTrace();request.setAttribute("msg", "用户名未找到"+username);} catch(PasswordWrongException e){e.printStackTrace();request.setAttribute("msg", "密码错误");}return mapping.findForward("success");}}

    UserManager

    模拟model和controller的功能。

package com.tgb.struts1;/***** * 逻辑处理,此处以简答的admin验证为例 * @author lidab_000 * */public class UserManager {public void login(String username,String password){if (!"admin".equals(username)) {throw new UserNotFoundException();}if (!"admin".equals(password)) {throw new PasswordWrongException();}}}

    配置文件

    web.xml

    这个是Tomcat读取的配置文件,在这里需要指定进入struts的请求类型和处理此请求的类。

  <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>    <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>    <load-on-startup>2</load-on-startup>  </servlet>  <!-- Standard Action Servlet Mapping -->  <servlet-mapping>    <servlet-name>action</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>

    struts-config.xml

    这个是struts读取的配置文件,在此配置文件中,需要设置通过截取url指定的处理类、转向信息、表单封装的类及其它信息,例如作用域等。

<!DOCTYPE struts-config PUBLIC          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"><struts-config><form-beans><form-bean name="loginForm"  type="com.tgb.struts1.LoginActionForm" /></form-beans><action-mappings><action path="/login" type="com.tgb.struts1.LoginAction"  name="loginForm"  scope="request"><forward name="success"  path="/login_success.jsp"/><forward name="error"  path="/login_error.jsp" /></action></action-mappings></struts-config>

    运行结果

    如果输入的都是admin,则显示登录成功:

    

流程分析

    使用时序图分析流程如下:

    我来解释一下这个流程:

  • 用户输入用户名、密码后提交请求
  • Tomcat得到请求,根据读取的web.xml,判断是否为struts指定的类型(*.do)
  • 如果是struts指定类型,则将请求转到指定的类文件(ActionServlet.java)
  • ActionServlet截取请求的url,匹配struts-config文件中的form和action类(LoginActionForm.java和LoginAction.java)
  • 将提交的表单数据放入form中(LoginActionForm)
  • 执行指定的Action(LoginAction),获取跳转信息(login_success.jsp)
  • ActionServlet执行跳转
  • 渲染页面,展现给用户

    这仅仅是从宏观上struts的执行流程,这仅仅是外在的表现,其内在如何执行?下篇博客带你走进struts1框架代码中,请看《预加载ActinoServlet》。

    更多相关博客,请至《层层递进Struts1(八)之总结》。


原创粉丝点击