今天编写了struts2.1的第一个程序,虽然功能很简单,但遇到的问题还很多
版本:struts-2.1.6
1.创建java web
2.导入jar包(不能是全部)
(复制struts2的例子struts2-blank-2.1.6中的jar)
或只导入需要的jar
* struts2-core-2.1.6.jar
* commons-fileupload-1.2.1.jar
* commons-logging-api-1.1.jar
* freemarker-2.3.13.jar
* ognl-2.6.11.jar
* xwork-2.1.2.jar
(本处只比例子中少了junit和spring相关的jar)
3.在web.xml文件中配置struts的filter过滤器
(不能复制例子程序中的web.xml)
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.在scr下创建struts.xml文件
struts.xml必须放在classpath下
与struts1.x有些不同
5.编写action并继承ActionSupport,覆盖execute方法
struts2中的action是struts1.x中的ActionForm+action
本action及可以收集参数和jsp来访问,也可以执行execute方法调用model层的代码
6.配置action在struts.xml中
需要配置真实的包,类的全名
<package name="lyl" extends="struts-default">
<action name="Hello" class="lyl.HelloAction">
<result >/hello.jsp</result>
</action>
</package>
7.创建hello.jsp
* 导入struts2的标签库
<%@ taglib prefix="s" uri="/struts-tags"%>
* 访问action中的属性值(必须要有getXXX方法)
<s:property value="message"/>
8.访问使用action中定义的name+.action 如 Hello.action
9.遇到的错误
9.1 复制struts2-blank-2.1.6中的web.xml文件将出错
因为它们的struts的filter不同
9.1.不能将所有的jar导入 struts2/lib/*.jar
导入struts2/lib/*.jar 将出现的错误,
Unable to load configuration. - bean - jar:file:/D:/tomcat6/webapps/struts/WEB- INF/lib/struts2-convention-plugin-2.1.6.jar!/struts-plugin.xml:30:119
解决方案:使用struts2自带的例子struts2-blank-2.1.6\WEB-INF\lib下的jar即可
9.2.没有将struts.xml放在src下
在访问时将出现找不到action
There is no Action mapped for namespace / and action name
9.3.配置action时需要用真实包
struts2的程序的执行流程:
1.用户通过url请求(.action)
2.服务器(如tomcat)将根据web.xml文件中配置的struts2的Filter(过滤器)
将所有.action的请求交由struts2处理
3.struts2在(classpath下)struts.xml文件中查找对应的action
4.调用action的execute方法,并返回string(SUCCESS)给struts2
5.struts2再次在struts.xml文件中对应的action中查找对应返回string的result标签,并转向到jsp页面中
6.jsp根据显示的内容,有可能需要访问action的属性(实际是通过反射调用getXxx方法)
7.运行jsp对应的servlet,并将运行结果放在response中,(实际上面使用的jsp都是编译好的servlet)
8.服务器从response中获取数据并生成html或其他的格式的文件,并将这些文件通过http协议发送给客户端(浏览器)