JavaWeb学习总结——Struts2入门与实例(尚硅谷_佟刚老师)


一、搭建Struts2的环境

1.1加入jar

Struts2/apps/struts2-blank/WEB-INF/lib下的所有jar包到当前web应用的lib目录下

1.2web.xml文件中配置struts2

复制Struts2/apps/struts2-blank/WEB-INF/web.xml文件中的过滤器的配置到当前web应用的web.xml文件中

  <!-- 配置Struts2Filter -->

  <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>

        <url-pattern>/*</url-pattern>

  </filter-mapping>

1.3 在当前web应用的classpath下添加struts2的配置文件struts.xml

复制struts/apps/struts2-blank/WEB-INF/class下的struts.xml文件到当前web应用的src

1.4 关联约束文档DTD

Window——>preference——>XML Catalog——>add(KeyType选择URI复制struts中的key)——>FileSystem(F:\研二\JAVAWEB\struts-2.3.31\src\core\src\main\resources\struts-2.3.dtd)——>struts.xml有提示

二、实现HelloWord

2.1 index.jsp

<a href=”product-input.action”>Product Input</a>

2.2编写struts.xml

http://localhost:8080/contextPath/namespace/actionName.action

    <!--

       package:包。struts2使用package来组织模块。

       name属性:必须。方便其他的包继承

       extends:java中的继承。同城继承struts-default

     -->

    <package name="helloWorld" extends="struts-default" namespace=”/”>

       <!-- 配置一个action:一个struts2的请求就是一个action -->

       <action name="product-input">

           <result>/WEB-INF/pages/input.jsp</result>

       </action>

       <action name="product-save" class="com.atguigu.struts2.helloworld.Product" method="save">

           <result name="details">/WEB-INF/pages/details.jsp</result>

       </action>

    </package>

2). 不需要显式的定义 Filter, 而使用的是 struts2 的配置文件.

3). details.jsp 比先前变得简单了.

${requestScope.product.productName} -> ${productName}

2.3 Product.java

private Integer productId;

  private String productName;

  private String productDesc;

  private Double productPrice;

  public String save() {

     return "details";

  }

2.4 pages中的input.jspdetails.jsp

 

    <form action="product-save.action" method="post">

    ProductName:<input type="text" name="productName"/>

    <br><br>

    ProductDesc:<input type="text" name="productDesc"/>

    <br><br>

    ProductPrice:<input type="text" name="productPrice"/>

    <br><br>

    <input type="submit" value="Submit"/>

    <br><br>

    </form>

    ProductId:${productId}

    <br><br>

    ProductName:${productName}

    <br><br>

    ProductDesc:${productDesc}

    <br><br>

    ProductPrice:${productPrice}

    <br><br>

三、默认值

<package name="helloWorld" extends="struts-default">

    <!-- 配置一个action:一个struts2的请求就是一个action -->

    <action name="product-input">

       <result>/WEB-INF/pages/input.jsp</result>

    </action>

<action name="product-save" class="com.atguigu.struts2.helloworld.Product" method="save">

       <result name="details">/WEB-INF/pages/details.jsp</result>

    </action>

    </package>

1.     默认namespace     

<package name="helloWorld" extends="struts-default" namespace=”/”>

 http://localhost:8080/contextPath/namespace/actionName.action

2.默认actionresult

    <action name="product-input"

             class="com.opensymphony.xwork2.ActionSupport"   method="execute">

<result name="success" type="dispatcher"> /WEB-INF/pages/input.jsp </result>

</action>

type="dispatcher" 转发

四、action Action

1). action: 代表一个  Struts2 的请求.

2). Action : 能够处理 Struts2 请求的类. ——>Product

> 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则.

> 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生

> 必须有一个不带参的构造器: 通过反射创建实例

> 至少有一个供 struts 在执行这个 action 时调用的方法

> 同一个 Action 类可以包含多个action 方法.

> Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例, Action 不是单例的, 是线程安全的.

五、在 Action 中访问 WEB 资源:

1). 什么是 WEB 资源 ?

      HttpServletRequest, HttpSession,ServletContext 等原生的 Servlet API

2). 为什么访问 WEB 资源?

      B\S 的应用的Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath....

3). 如何访问 ?

I. Servlet API 解耦的方式: 只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).

> 使用 ActionContext

        public String execute() {

      

       //0.获取ActionContext对象

       ActionContext actionContext = ActionContext.getContext();

       //1.获取application对应的Map

       Map<String, Object> applicationMap = actionContext.getApplication();

           //设置属性

       applicationMap.put("applicationKey", "applicationValue");

           //获取属性

       Object date = applicationMap.get("date");

       System.out.println("date="+date);

       //2.session

       Map<String, Object> sessionMap = actionContext.getSession();

       sessionMap.put("sessionKey", "sessionValue");

       //3.request(与其他不同)

       Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");

       requestMap.put("requestKey", "requestvalue");

       //4.获取请求参数对应的Map,并获取指定参数值

       //parameters只能读不能写,写也不出错

       Map<String,Object> parameters = actionContext.getParameters();

       System.out.println("parameters"+((String[])parameters.get("name"))[0]);

       //不行

       parameters.put("age", 100);

       return "success";

    }

> 实现 XxxAware 接口

Struts2-3

> 选用的建议:若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map parameters, 则建议使用Aware 接口的方式

> session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!

     if(sessionMapinstanceof SessionMap){

           SessionMap sMap = (SessionMap)sessionMap;

           sMap.invalidate();

           System.out.println("session失效了");

       }

II. Servlet API 耦合的方式: 可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.

> 使用 ServletActionContext

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session = ServletActionContext.getRequest().getSession();

ServletContext servletContext = ServletActionContext.getServletContext();

System.out.println("execute...");

> 实现 ServletXxxAware 接口.

六、关于 Struts2 请求的扩展名问题

1).org.apache.struts2 包下的default.properties 中配置了 Struts2 应用个的一些常量

2).struts.action.extension 定义了当前 Struts2 应用可以接受的请求的扩展名.

3). 可以在 struts.xml 文件中以常量配置的方式修改default.properties 所配置的常量.

<constant name="struts.action.extension" value="action,do,"></constant>

七、ActionSupport

1).ActionSupport 是默认的 Action : 若某个 action 节点没有配置 class 属性, ActionSupport 即为待执行的 Action . execute 方法即为要默认执行的 action 方法

<actionname="testActionSupport">

      <result>/testActionSupport.jsp</result>

</action>

等同于

<actionname="testActionSupport"

      class="com.opensymphony.xwork2.ActionSupport"

      method="execute">

      <result>/testActionSupport.jsp</result>

</action>

2). 在手工完成字段验证, 显示错误消息, 国际化等情况下, 推荐继承 ActionSupport.

八、result:

1). result action 节点的子节点

2). result 代表 action 方法执行后, 可能去的一个目的地

3). 一个 action 节点可以配置多个 result 子节点.

4). result name 属性值对应着 action 方法可能有的一个返回值.

<resultname="index">/index.jsp</result>

5). result 一共有 2 个属性, 还有一个是 type: 表示结果的响应类型

6). result type 属性值在 struts-default 包的 result-types 节点的 name 属性中定义.

常用的有

> dispatcher(默认的): 转发. Servlet 中的转发.

> redirect: 重定向

>redirectAction: 重定向到一个 Action

注意: 通过redirect的响应类型也可以便捷的实现redirectAction 的功能!

      <result name="index"type="redirectAction">

             <paramname="actionName">testAction</param>

             <paramname="namespace">/atguigu</param>

      </result>

      OR

      <result name="index"type="redirect">/atguigu/testAction.do</result>

> chain: 转发到一个 Action

   注意: 不能通过 type=dispatcher 的方式转发到一个 Action

        只能是:

       <result name="test"type="chain">

             <paramname="actionName">testAction</param>

             <paramname="namespace">/atguigu</param>

      </result>

      不能是:

      <resultname="test">/atguigu/testAction.do</result>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章