欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2学习

程序员文章站 2022-07-04 18:48:08
...

1.Model2模型:

在java web开发中,基于Servlet+JSP+JavaBean的开发模型称为Model2模型,该模型完全遵守MVC模式:
JavaBean:模型层,既可以封装数据,又可作为业务逻辑模型。接收到控制器传递的更新请求后,执行逻辑处理返回响应的执行结果。
JSP:表现层,负责提供用户数据显示页面,并在适当时候(提交表单)向控制器请求模型更新。
Servlet:控制器。接收用户请求,然后获取数据并转换为业务模型需要的模型,然后调用模型的业务方法,请求模型更新;同时根据执行结果选择返回的视图页面。
基本流程:
1 用户发出一个request请求,会被控制器servlet接收到。
2 servlet将请求的数据转换成数据模型javabean,然后调用模型的逻辑方法。
3 servlet把业务逻辑模型返回的结果放到合适的地方,譬如request的属性里。
4 根据逻辑模型返回结果,servlet选择合适的jsp视图。
5 jsp视图展示数据给用户。
缺点:
1 流程凌乱:servlet既要处理请求,还要处理页面流程,功能不单一,无法把握整个系统的页面流程。
2 数据传递无序:使用javabean传递数据比较繁琐,有时候无法满足需求。
3 缺乏辅助功能:没有统一的分发调度 验证框架 国际化 异常处理等等功能。

2.Struts2

Struts2:基于mvc轻量级web框架
Struts2:控制器(StrutsPrepareAndExecuteFilter),视图(Result),模型(Action)
控制器:
该过滤器负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。该控制器其实是一个过滤器,是Struts2内置类,只是要在项目的web.xml中配置一下即可。
动作–Action模型:
负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,获取下一个视图所需要的数据。实现了与Servlet API的解耦
视图–Result:
视图结果用来把动作中获取到的数据展现给用户。

2.1 Struts2配置:

步骤:
1 从官网下载struts-2.5.10.1-all.zip
2 创建web项目,拷贝必须jar文件,放置在WEB-INF下的lib目录中。(可以从官网下载struts-2.5.10.1-min-lib.zip)
在web.xml中添加核心控制器配置:

<!-- Struts2核心控制器 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

4 创建对应jsp文件
5 创建对应的Action模型类
6 在项目的src目录下创建struts.xml文件
参考下载的Struts文件目录的.\app\struts2-showcase.war\WEB-INF\classes\struts.xml。

<struts>
    <package name="my" extends="struts-default">
        <!-- 没有method属性,则默认调用Action的execute方法 -->
        <action name="loginAction" class="org.westos.action.UserAction">
            <result name="suc">/suc.jsp</result>
            <result name="fail">/fail.jsp</result>
        </action>
        <!-- 未使用默认方法,设置method属性 -->
        <action name="registerAction" class="org.westos.action.UserAction" method="register">
            <result name="regSuc">/regSuc.jsp</result>          
        </action>

        <action name="login2Action" class="org.westos.action.OtherAction">
            <result>/suc2.jsp</result>
            <result name="error">/fail.jsp</result>
        </action>

        <action name="login3Action" class="org.westos.action.AnotherAction">
            <result>/suc3.jsp</result>
            <result name="error">/fail.jsp</result>
        </action>
    </package>
</struts>

2.2 Struts2执行流程:
Struts2学习

  • Action:
    代表一次请求或调用,对应于一个Action类。
    在Struts2里面充当着MVC中模型的角色,既封装了业务数据,又要处理业务功能。但在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,Action只是去调用逻辑层来进行业务逻辑的处理。
    Action中方法实现的功能,是MVC中控制器部分的功能。
    因为过滤器作为核心控制器,Action常看做model层。
  • Action的实现方式:
    在Struts2中,Action可以不实现任何特殊的接口或者继承特殊的类,仅仅是一个POJO(Plain Old Java Object,简单的Java对象)就可以,但要有一个公共的无参的构造方法,还可以有一个返回String类型的execute或其他方法
    如果struts.xml配置文件中Action没有method属性,则execute方法是必须的。
    但实际开发的时候,Action实现方式。
    1.实现Action接口中,仅仅定义了前面的execute方法,除外还有一系列预定义的字符串常量,可以用于返回一些预定的result。
    2.继承ActionSupport类 ,除实现了Action接口,还提供更多辅助功能。推荐使用
  • Action获取页面数据:
    在Struts2中,页面的数据传递给Action有两种基本方式:属性驱动(FieldDriven)和模型驱动(ModelDriven)。
    属性驱动又有两种情况:
    1 基本数据类型的属性对应:控件的name属性,和Action的属性对应。
    2 JavaBean风格的域对象对应: 控件的name属性是域对象.属性名方式。推荐方式

3.动态Web项目代码

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Struts2Study2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- Struts2核心控制器 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

struts.xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true"></constant>
    <package name="my" extends="struts-default">
        <interceptors>
            <interceptor name="loginInterceptor" class="org.westos.action.LoginInterceptor"></interceptor>
            <interceptor-stack name="myStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="loginInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 默认拦截器声明,对package范围Action均生效 -->
        <default-interceptor-ref name="myStack" />

        <!-- package级别的Result,对所有Action均生效 -->
        <global-results>
            <result name="login">/index.html</result>
        </global-results>

        <!-- 没有method属性,则默认调用Action的execute方法 -->
        <action name="loginAction" class="org.westos.action.UserAction">
            <result>/suc.jsp</result>
            <result name="error">/fail.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

        <action name="anotherAction" class="org.westos.action.AnotherAction">
            <result>/suc2.jsp</result>
        </action>
    </package>
</struts>

Action类:

package org.westos.action;

import java.io.Serializable;

public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4613077549622196817L;

    private String name;
    private String pwd;
    private String gender;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }

}
package org.westos.action;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {


    /**
     * 
     */
    private static final long serialVersionUID = -6266423214755049789L;

    private String name;
    private String pwd;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Override
    public String execute() throws Exception {
        if("ts".equals(name)) {
            User u = new User();
            u.setName(name);
            u.setPwd(pwd);
            //和Servlet进行交互
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("us", u);
            return SUCCESS;
        }
        return ERROR;
    }

}
package org.westos.action;

import java.util.ArrayList;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class AnotherAction extends ActionSupport {

    /**
     * 
     */
    private static final long serialVersionUID = 5511163633883650547L;

    @Override
    public String execute() throws Exception {
        ArrayList<User> list = new ArrayList<>();
        for (int i = 0; i <=10; i++) {
            User u = new User();
            u.setName("user"+i);
            u.setPwd("pwd"+i);
            list.add(u);
        }
        ServletActionContext.getRequest().setAttribute("us", list);
        return SUCCESS;
    }



}
package org.westos.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoginInterceptor implements Interceptor {

    /**
     * 
     */
    private static final long serialVersionUID = 4378531652823521065L;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void init() {
        // TODO Auto-generated method stub

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        //Struts2对HttpSession封装为Map格式
        Map<String,Object> map = invocation.getInvocationContext().getSession();
        //是否保存us键值对
        if(map.get("us")==null) {
            return "login";
        }
        else {
            return invocation.invoke();
        }   
    }

}

前台页面:
index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
    <form action="loginAction">
    用户名:<input type="text" name="name" placeholder="请输入用户名"><br>
    密码:<input type="password" name="pwd" placeholder="请输入密码"><br>
    <input type="submit" value="提交">

    </form>
</body>
</html>

suc.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功页面</title>
</head>
<body>
<!-- el -->
  1 欢迎你${name}<br/>
  <!-- struts2标签获取ValueStack中属性的值 -->
  2  <s:property value="name"/><br/>
  <!-- struts标签获取ActionContext根对象中session对应的值 -->
  3  <s:property value="#session.us.pwd"/><br/>
  <!-- el表达式 -->
  4 ${sessionScope.us.pass}
</body>
</html>

suc2.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <s:iterator value="#request.us" var="u">
     <s:property value="#u.name"/>
     <s:property value="#u.pwd"/>
   </s:iterator>
</body>
</html>

fail.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>失败页面</title>
</head>
<body>
登陆失败...
</body>
</html>
相关标签: Struts2