Struts2基础复习系列(2)

承接Struts2基础复习系列(1)

四、 配置详解

  1. 第一个例子:首先搭建第一个例子,在myEclipse建立一个web项目。导入struts包,支持struts2运行的最小jar包可以再下载的struts.zip中的apps下找到struts2-blank.war通过解压软件解压,后查看lib目录下所需要的jar包:
    所需jar包

    直接新建一个class类,起名UserAction。写一个execute方法。

    import com.opensymphony.xwork2.Action;

    public class UserAction  implements Action {
        public UserAction(){
            System.out.println("----UserAction----");
        }
        public String execute()  {
            System.out.println("execute()");
            return "success";
        }
    }

在struts.xml进行配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.configuration.xml.reload" value="true"></constant>
<package name="default"  extends="struts-default" namespace="/">
    <action name="user" class="com.struts.review1.UserAction">
        <result type="" name="success">/success.jsp</result>
    </action>
</package>
</struts>    

最后部署到服务器中,在浏览器输入127.0.0.1:8080/projectName/user.action即可。

  1. 解析struts.xml
    (TNT,,,图片太小了,不知道怎么弄大,我就分着截图几次吧。)
    这里写图片描述
    左上:
    左上
    右上:
    右上
    右中:
    右中
    右下:
    右小
    左下:
    左下
    左中:
    左中
    通过这个可以看出,服务器启动的时候回自动加载struts-default.xml,struts-plugin.xml,struts.xml这三个xml文件,由于这里被struts写死了,因此对于struts.xml文件我们不能给他改名字,除非你改struts底层代码。如果需要重命名则最好新建一个struts*.xml文件,而后在struts.xml中利用include标签,将自定义的包含进来。

  2. struts.xml相关配置解释

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
    <action name="user" class="com.struts.review1.UserAction">
        <result name="success">/success.jsp</result>
        <result name="input">/userInput.jsp</result>
    </action>
</package>
</struts>    

a. pagckage:
 用来管理Action的,其属性主要有name,namespace,extends
 name:包的名称,用作标识,不能重复。
 namespace:命名空间,url访问时使用,可以理解成文件夹,/则 会根目录,访问地址为:127.0.0.1:8080/xxx.action,如为:/hello,则url访问地址就变成,127.0.0.1:8080/hello/xxx.action。
 extends:继承关系。通过上面第2点可以看出,当服务器启动的时候,不仅加载了struts.xml还加载了struts-default.xml。具有struts-default的所有功能,此外,这个属性必须填写。当继承的时候,子package会获得父package的所有功能。详细如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default"  extends="struts-default" namespace="/">
            <action name="user" class="com.struts.review1.UserAction">
                <result name="success">/success.jsp</result>
                <result name="input">/userInput.jsp</result>
            </action>
</package>
<package name="default2"  extends="default" namespace="/hello">
</package>
</struts>    

对于上面的配置来说,你访问的是user.action还是hello/user.action均是一样的。都是对com.struts.review1.UserAction的访问。

b. Action配置
 action可以理解为代表一个类,有class,name,method等属性,class为该action所映射的类的全包名,name为访问该action的名字,method为访问这个action时实际访问这个类的哪个方法,如果不指定method则默认执行execute方法。如:

<action name="user" class="com.struts.review1.UserAction">
</action>

访问的是user.action的execute方法

 <action method="login" name="user" class="com.struts.review1.UserAction"> </action>

访问的是user.action的login方法
当然class还可以不写,当不写的时候,则默认执行ActionSupport的execute方法,该方法的实质就仅仅是返回一个SUCCESS静态常量字符串。
c. Result配置
 result代表结果集,既是返回到物理视图中。有type和name属性。
 type:为结果集类型,struts定义了如下的结果集:

常用的主要有dispatcher(转发),redirect(重定向),redirectAction(重定向到action),其中前者是默认值。
 name为action方法执行的返回值,如果返回值与这里定义的name有匹配的则会返回到相应的jsp页面当中,当然name也可以不写,不写的默认值为”success”。

五、 Action的三种实现方式

  1. 直接写javabean,写一个execute方法。
  2. implement Action 重写execute方法
  3. extends ActionSupport

六、 Action的启动模式

在第一点提到过,Servlet是单例模式的,因此容易出现线程不安全问题。那么在struts2中,action又是属于哪种模式的呢?检测方法很贱,只要写一个Action,再起构造方法进行输出,如果每次刷新下都能够重新执行构造方法则表示是多例模式的,如果每次刷新下都没重新执行构造方法则表示是单例模式的。
先来看看servlet:
Servlet:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletTest extends HttpServlet {
    public ServletTest() {
        super();
        System.out.println("-----Servlet-----");
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("----doget------");
        request.getRequestDispatcher("success.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
    public void init() throws ServletException {
    }
}

输出
servlet输出
可以看出Servlet是单例模式的。
Action:

package com.struts.review1;

import com.opensymphony.xwork2.Action;

public class UserAction  implements Action {

    public UserAction(){
        System.out.println("----UserAction----");
    }

    public String execute()  {
        System.out.println("execute()");
        return "success";
    }

}

输出:
action输出
显然可以看到action是多例模式的。

就先写这么多吧,希望大家多多指教,有不对或者不好的地方欢迎留言评论留言,有什么问题可以一样可以留言。共同研究~~~。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值