Strust.xml文件默认是没有提示的,我们需要添加DTD约束 ,来让它有提示

         <!DOCTYPE struts PUBLIC

                   “-Apache Software Foundation//DTD Struts Configuration 2.3//EN”

                   Http://struts.apache.org/dtds/struts-2.3.dtd>

 

 

添加dtd的时候可以手动添加

勾选上面的dtd路径copy 然后Window -> Preferences -> 搜索xml 选择XML Catlog -> Add选项  -> 将复制的字符串加入key àkeyType选择URI  ->  选择Location下面的FileSystem

è 选择对应的dtd文件 ,如E:\struts2\struts-2.3.16.1\src\core\src\main\resources下的dtd文件:这样在该xml文件中就有标签提示了。

 

 

 

 

1)、搭建struts2的开发环境

 

2)、不需要显示的定义Filter,而是用的是Struts2的配置文件

 

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

${requestScope.product.productName} à${productName}

4)、步骤

①.由product-input.action 转到/WEB-INF/pages/input.jsp

在struts2中配置一个action

<action name="product-input" >

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

    </action>

 

②.由input.jsp页面的action : product-save.action 到Product’s  save,

再到/WEB-INF/pages/details.jsp

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

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

</action>

 

在product中定义一个save方法 ,返回值为details字符串

 

Struts2乱码问题的解决

 

在web.xml文件中配置一个过滤器来解决乱码问题 ,并且 这个过滤器必须写在struts2 Filter之前才能解决乱码问题 ,否则不能解决。

 

Helloworld案例 全部文件信息

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>

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

    </filter-mapping>

 

Product.java

package com.atguigu.struts2.helloworld;

 

public class Product {

    private Integer productId;

    private String productName;

    private String productDesc;

    private double productPrice;

    public Integer getProductId() {

       return productId;

    }

    public void setProductId(Integer productId) {

       this.productId = productId;

    }

    public String getProductName() {

       return productName;

    }

    public void setProductName(String productName) {

       this.productName = productName;

    }

    public String getProductDesc() {

       return productDesc;

    }

    public void setProductDesc(String productDesc) {

       this.productDesc = productDesc;

    }

    public double getProductPrice() {

       return productPrice;

    }

    public void setProductPrice(double productPrice) {

       this.productPrice = productPrice;

    }

   

    @Override

    public String toString() {

       return "Product [productDesc=" + productDesc + ", productId="

              + productId + ", productName=" + productName

              + ", productPrice=" + productPrice + "]";

    }

    public String save(){

       System.out.println("save"+this);

       return "details";

    }

}

 

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

    <!--

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

       name属性:必须,用于其他的包引用当前包

       extends:当前包继承哪个包,继承的,即可以继承其中所有的配置,通常情况下继承自struts-default

       struts-default 这个包在struts-default.xml文件中定义。

       namespace:属性是可选的,如果他没有给出,则以"/"为默认值,若namespace有一个非默认值,则要想调用这个包里的

       Action,就必须把这个属性所定义的命名空间添加到有关的URI字符串里,

       即在以前servletPath前面加上namespace

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

      

       namespace:属性值前面必须要有斜杠

      -->

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

   

       <!--

            配置一个action:一个Struts2的请求就是一个action

            name:对应一个struts2的请求的名字 (或对应一个servletPath,但去除/和扩展名),不包含扩展名

            result:结果,标示一个result,和action 方法的返回值对应,默认值为success

            type:标示结果的类型,默认值为dispatcher(标示转发的结果)

            class的默认值为com.opensymphony.xwork2.ActionSupport

            method的默认值为execute方法

        -->

       <action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute" >

           <!--

              result:结果,表示action方法执行的后可能返回的一个结果,所以一个action节点可能会有多个result子节点

              多个result子节点 使用name来区分

              name:标示一个result,和actoin 方法的返回值对应 ,默认值为success

              type:表示结果的类型,默认值为dispatcher,表示转发的结果

            -->

          

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

       </action>

      

      

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

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

       </action>

    </package>

</struts>

Index.jsp

<body>

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

</body>

 

Input.xml

  <body>

       <form action="atguigu/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"/>

       </form>

  </body>

 

Details.jsp

 

  <body>

    ProductId:${productId }

    <br/><br/>

    ProductName:<%=request.getAttribute("productName") %>

    <br/><br/>

    ProductDesc:${productDesc }

    <br/><br/>

    ProductPrice:${productPrice }

    <br/><br/>

    <%=request %>

    request同样可以得到productName的属性值,但这个request已经不是服务器创建的那个request了 是经过struts2封装过后的request

    org.apache.struts2.dispatcher.StrutsRequestWrapper@15eb4d0

  </body>

 文件目录结构如下: