3

Struts 2是一种MVC框架。

Struts 2框架中的处理大概分为以下几个步骤:

  1. 客户端初始化一个指向Servlet容器的请求;

  2. 这个请求经过一系列的过滤器(Filter)后,核心控制器FilterDispatcher根据请求询问ActionMapper来决定这个请求是否需要调用某个Action。如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxyActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。

  3. ActionProxy创建一个ActionInvocation的实例。ActionInvocation实例使用命令模式调用,回调Actionexecute方法,该方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。在调用Action的过程前后,将涉及到相关拦截器的调用。

  4. Action执行完毕后,ActionInvocation会根据 struts.xml 中的配置找到对应的返回结果并将其输出到浏览器中,可以是HTML页面、图像,也可以是文档。此时支持的视图技术非常多。

实现一个Struts 2应用,只需要配置 struts.xml 文件,编写Action代码和相关视图资源文件。

请输入图片描述


struts 2配置文件:

配置文件是用户视图(View)和业务逻辑模块(Model)Action之间的桥梁。

  • 配置Action的 struts.xml 文件,
  • 配置Struts 2全局属性的 struts.properties 文件

一个实例:

配置好开发环境,安装好Struts(将所需要的jar包放入相应位置)。

web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    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">

  <display-name>struts 2.0 应用项目</display-name>

  <filter>
    <filter-name>struts2</filter-name>
    <!-- filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class-->
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

设计动作控制类
package com.struts2.app;

public class UserLoginAction {
    //下面是Action用于封装用户请求参数的两个属性
    private String name;
    private String pass;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String password) {
        this.pass = password;
    }

    //处理用户请求的execute方法
    public String execute() throws Exception {
        if("admin".equals(getName()) && "12345".equals(getPass())) {
            return "success";
        }
        else if(getName()==null || getPass()==null) {
            return "input";
        }
        else return "error";
    }
}


配置Action类: Struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<!--include file="struts-default.xml" /-->

    <!-- Struts 2 的Action必须放在指定的包空间下定义 -->
    <package name="struts" extends="struts-default">

        <action name="UserLogin" class="com.struts2.app.UserLoginAction">
            <result name="error">/error.jsp</result>
            <result name="success">/welcome.jsp</result>
            <result name="input">/index.jsp</result>
        </action>

    </package>

</struts>

设计视图:JSP视图
  • index.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>

<html>
<head>
    <title>Struts 2 Demo</title>
</head>
<body>
    <form action="UserLogin.action" method="post">
        <table align="center">
            <caption><h4>用户登录信息</h4></caption>
            <tr>
                <td>用户名:<input type="text" name="name" /></td>
            </tr>
            <tr>
                <td>密 码:<input type="password" name="pass" /></td>
            </tr>
            <tr align="center">
                <td colspan="2"><input type="submit" value="登 录" /><input type="reset" value="清 除" /></td>
            </tr>
        </table>
    </form>
</body>
</html>


  • welcome.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>
<%@taglib prefix="s" uri="/struts-tags"%>

<html>
<head>
    <title>登录成功页面</title>
</head>
<body>
    您已成功登录本系统!
    <li><a href="<s:url action="UserLogin" />">重新登录</a></li>
    <br>
</body>
</html>

  • error.jsp
<%@page language="java" import="java.util.*" pageEncoding="GBK" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<% String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName()+
    ":"+request.getServerPort()+path+"/"; %>

<html>
<head>
    <base href="<%=basePath%>">
</head>
<body>
    您输入的用户名或密码错误,请重新输入
    <br><li><a href="<s:url action="UserLogin" />">Sign on</a></li>
</body>
</html>

实例过程总结

login.jsp (页面内跳转地址,struts拦截) ===> struts.xml (指定并调用Action类,以及不同结果下返回的视图界面)===>UserLoginAction.java (execute方法,返回值)===>struts.xml (获得返回值,调用视图)

可以看出,整个过程和servlet十分相似。只不过servlet使用web.xml映射java文件和路径,这里是用struts.xml(当然前提是在web.xml中有struts配置)。另外,servlet是直接用java文件返回其视图的;而这里通过三个jsp视图文件处理不同情况下的视图。这样,即将视图层与控制层分开。


psy
392 声望12 粉丝

假装平静的外表下一颗躁动的心


引用和评论

0 条评论