zoukankan      html  css  js  c++  java
  • struts2初体验

    一:什么是struts2?

    Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点

    Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性

    二:struts2的项目结构

    apps目录:Struts2示例应用程序

    docs目录:Struts2指南、向导、API文档

    lib目录:Struts 2的发行包及其依赖包

    src目录:Struts 2项目源代码

    步骤一:配置web.xml文件

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
         <filter-name>struts2</filter-name>
         <!-- 拦截所有的action -->
         <url-pattern>/*</url-pattern>
      </filter-mapping>

    步骤二:在src目录下创建struts2.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <!-- 配置文件中只要添加以下配置,那么以后修改配置文件不用重启tomcat -->
        <constant name="struts.devMode" value="true" />
    
        <package name="default" namespace="/" extends="struts-default">
            <!-- 第一个action的例子 -->
            <action name="helloWorld" class="cn.happy.action.HelloWorldAction">
                <result name="success">
                   index.jsp
                </result>
            </action>
            <!-- 登陆的action -->
        </package>
        <!-- Add packages here -->
    </struts>

    步骤三:编写Action类

    package cn.happy.action;
    
    import com.opensymphony.xwork2.Action;
    
    public class HelloWorldAction implements Action{
        private String name ;
        private String message;
        public String execute() throws Exception {
            setMessage("Hello"+getName());
            return "success";
        }
    }

    步骤四:创建index.jsp页面

    <div>
            <h1>
                <!--显示Struts Action中message的属性内容-->
                <s:property value="message"/>
            </h1>
        </div>
        <div>
            <form action="helloWorld.action" method="post"> 
                请输入您的姓名: 
                <input name="name" type="text" />
                <input type="submit" value="提交" />
            </form>
        </div>

    步骤五:使用浏览器访问

    运行结果

    案例二:

    实现登陆案例

    步骤一:在src目录下创建struts2.xml配置文件,如下:

    <struts>
       <!-- 修改该文件,tomcat不用重启 -->
        <constant name="struts.devMode" value="true"/>
        <package name="default" namespace="/" extends="struts-default">
            <action name="HelloWorldAction" class="cn.action.HelloWorldAction">
               <result name="success">/success.jsp</result>
               <result name="login">/error.jsp</result>
            </action>
        </package>
    </struts>

    步骤二:创建Action类

    注意:在此需要校验从前台传递过来的用户名和密码,所以我们需要在Auction类中植入两个属性,但如果当属性过多时我们就可以将这些属性封装成为实体类,在Action类中引用它们。

    1.1创建实体类UserInfo

    package entity;
    public class UserInfo {
     private String username;
     private String userpwd;
    public String getUsername() {
        return username;
    }
    public String getUserpwd() {
        return userpwd;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }
     
    }

    1.2

    创建的Action类加多实现一个接口:ModelDriven<T>,并且重写该接口的抽象方法!

    package cn.action;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ModelDriven;
    
    import entity.UserInfo;
    
    public class HelloWorldAction implements Action,ModelDriven<UserInfo> {
        private UserInfo users=new UserInfo();
        @Override
        public String execute() throws Exception {
            
            /*Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("username", users.getUsername());*/
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("username", users.getUsername());
            if(users.getUsername().equals("admin")&&users.getUserpwd().equals("admin"))
            {
                return "success";
            }
            else
            {
                return "login";
            }
        }
        @Override
        public UserInfo getModel() {
            // TODO Auto-generated method stub
            return users;
        }
    }

    步骤三:获取session

    方式:耦合

             解藕

    1.1耦合方式:

    方式一:

    HttpSession session2 = ServletActionContext.getRequest().getSession()

    方式二:

    1.2解耦方式

    方式一:

    Map<String, Object> session = ActionContext.getContext().getSession();

    返回值是一个Map集合,我们回想下当初我们学习servlet时,如何向session的作用域中存放数据?

    request.getSession().setAttribute(string,Object);

    怎么样,眼熟吧!不解释

    方式二:

    使用struts2提供的SessionAware接口为我们自动装配出来一个Map集合,使用同上!

    那么问题来了?这两种方式有什么不同吗?

    解耦方式:

      为了避免与Servlet API耦合在一起,方便Action类做单元测试,
      Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,
      构造了三个Map对象来替代这三种对象,在Action中,
      直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。
      要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类

    耦合方式:

    直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。

    要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。

    步骤三:创建登陆界面

     <s:form name="form1" namespace="/" method="post" action="login">
           请输入用户名: <s:textfield name="username"></s:textfield> <br/>
            <s:textfield name="password"></s:textfield><br/>
            <s:submit value="登陆"></s:submit>
         </s:form>
  • 相关阅读:
    Retrofit/Okhttp API接口加固技术实践(上)
    浅析C#中的结构体和类
    iOS中 支付宝钱包具体解释/第三方支付 韩俊强的博客
    Java并发之volatile二
    dynamic initializer和全局变量
    二叉树转换成森林&amp;森林变成二叉树
    这才是真正的裸眼3D!超级震撼!!
    每一个开发人员都应该有一款自己的App
    Hibernate HQL的使用
    我的Android进阶之旅------&gt;Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  • 原文地址:https://www.cnblogs.com/chimingyang/p/5906210.html
Copyright © 2011-2022 走看看