步骤一:IDEA创建web项目,在web目录下创建web.xml、lib目录、classes目录。导包到lib目录下,指定输出目录到classes下(
1. 打开project structure
2. 设置 project complier output 为:
E:\project\j2ee\web\WEB-INF\classes
)
在web.xml中配置一个Filter,所有请求都会被过滤到这个Filter
<
web-app
>
<
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
>
<
dispatcher
>FORWARD</
dispatcher
>
<
dispatcher
>REQUEST</
dispatcher
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
</web-app>
步骤二:配置struts.xml
在src目录下创建struts.xml文件
这是最简单的struts.xml配置
其效果是当访问index路径的时候,服务端跳转到index.jsp
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
<
struts
>
<
package
name
=
"basicstruts"
extends
=
"struts-default"
>
<
action
name
=
"index"
>
<
result
>index.jsp</
result
>
</
action
>
</
package
>
</struts>
步骤三:部署tomcat,测试
思路图
1. 所有的访问都回被web.xml中配置的Struts 的 Filter所拦截
2. 拦截之后,就进入struts的工作流程
3. 访问的地址是/index,根据struts按照 struts.xml中的配置,服务端跳转到index.jsp
4. 显示index.jsp的内容
把Model的数据显示在视图JSP上
Model层使用一个简单的Product.jav用于存放数据
ProductAction用于控制
在struts.xml中配置跳转
该配置表示 访问路径
/showProduct
会调用 ProductAction 类的 show 方法
服务端跳转到show.jsp
<
struts
>
<
package
name
=
"basicstruts"
extends
=
"struts-default"
>
<
action
name
=
"showProduct"
class
=
"com.how2java.action.ProductAction"
method
=
"show"
>
<
result
name
=
"show"
>show.jsp</
result
>
</
action
>
</
package
>
</struts>
在web目录下创建show.jsp文件
注:
${product}会访问对应的Action的
getProduct()
方法
注: 严格得说,是Struts通过getProudct()方法返回product对象,然后再把product对象通过request.setAttribute("product", product) 放在"product" 这个key上,这样就方便EL表达式去取出来了
(做个实验是否是request.setAttrubute();
改成<
result
name
=
"show" type="redirect"
>show.jsp</
result
>客户端跳转,那么show.jsp收不到product对象)
<%@page isELIgnored="false"%>
${product.name}
测试
原理:
1. 访问路径 /showProduct
2. 所有访问都被struts的filter所拦截,并进入struts的工作流程
3. 根据配置文件struts.xml, 会执行ProductAction的show方法
4. 在show方法中,将实例属性product指向一个新的对象,并设置名称为iphone7
5. 服务端跳转到show.jsp
6. 在show.jsp中,访问ProductAction.getProduct() 获取实例属性product,并显示其名称iphone7
jsp提交product的name到action
然后action又跳转回showProduct.jsp把提交上来的name显示出来
addProduct.jsp
<
html
>
<
form
action
=
"addProduct"
>
<
input
type
=
"text"
name
=
"product.name"
>
<
br
/>
<
input
type
=
"submit"
value
=
"submit"
>
</
form
>
</
html
>
配置struts.xml
<
action
name
=
"addProduct"
class
=
"com.how2java.action.ProductAction"
method
=
"add"
>
<
result
name
=
"show"
>show.jsp</
result
>
</
action
>
ProductAction增加add方法
在addProduct.jsp中提交数据的field是product.name
会自动调用对应的Action的setProduct(Product product)方法进行数据的注入
所以ProductAction必须提供setProduct(Product product)方法
在执行到第14行的时候,jsp传过来的name已经被注入进了属性product中了
原理图
1. 访问路径 /addProduct
2. 所有访问都被struts的filter所拦截,并进入struts的工作流程
3. 根据配置文件struts.xml, 会执行ProductAction的add方法
4. 在add方法执行之前,Struts生成一个新的product对象,并把页面传递过来的name设置在该对象上,接着把该对象通过setProduct()方法,注入ProductAction
5. 服务端跳转到show.jsp
6. 在show.jsp中,访问ProductAction.getProduct() 获取注入的product,并显示其名称