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>
文件目录结构如下: