首页 > 代码库 > struts2初体验

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="http://www.mamicode.com/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="http://www.mamicode.com/message"/>        </h1>    </div>    <div>        <form action="helloWorld.action" method="post">             请输入您的姓名:             <input name="name" type="text" />            <input type="submit" value="http://www.mamicode.com/提交" />        </form>    </div>

步骤五:使用浏览器访问

技术分享

 

运行结果

技术分享

案例二:

实现登陆案例

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

<struts>   <!-- 修改该文件,tomcat不用重启 -->    <constant name="struts.devMode" value="http://www.mamicode.com/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="http://www.mamicode.com/登陆"></s:submit>     </s:form>

 

struts2初体验