用自己的话简要阐述struts2的执行流程。 Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下:
1、客户端浏览器发出HTTP请求。
2、根据web.xml配置,该请求被FilterDispatcher接收。
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
6、返回HTTP响应到客户端浏览器。
(1)关于配置
①struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.configuration.xml.reload" value="true"></constant>
<package name="system" namespace="/system" extends="struts-default">
<action
name="user"
class="cn.com.leadfar.UserAction"
>
<result name="add_input">/user/add_input.jsp</result>
<!-- name是add方法的返回值-->
<result name="success">/user/add_success.jsp</result>
</action>
</package>
</struts>
②web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>
</web-app>
③ add_input.jsp
<body>
<!-- action中的system/user是struts2里面对应的namespace="/system和 name="user" add是UserAction里面的add方法-->
<form action="system/user!add" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
性别: <select name="sex">
<option value="true">男</option>
<option value="false">女</option>
</select> <br/>
存款:<input type="text" name="money"><br/>
<input type="submit" val④ue="提交">
</form>
</body>
④UserAction.java
package cn.com.leadfar;
import com.opensymphony.xwork2.ActionContext;
public class UserAction {
private String name;
private int age;
private boolean sex;
private double money;
public String add_input(){
return "add_input";
}
public String add(){
ActionContext.getContext().put("name", "杨幂");
ActionContext.getContext().put("age", "23");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
⑤add_success.jsp
<body>
通过el表达式
用户名:${name}<br/>
性别:${sex} <br/>
通过taglib
用户名:<s:property value="name"/><br/>
年龄:<s:property value="sex"/><br/>
<hr/>
通过ognl表达式取值<br/>
#name:<s:property value="#name"/><br/>
#age:<s:property value="#age"/><br/>
</body>
(2)如何在jsp页面获得数据库层(或者dao层)数据 Ognl
用户id:<input type="text" name="id" value="<s:property value="id"/>"><br/>
用户名:<input type="text" name="name" value="<s:property value="name"/>"><br/>
性别:<input type="text" name="sex" value="<s:property value="sex"/>"><br/>
年龄:<input type="text" name="age" value="<s:property value="age"/>"><br/>
薪资:<input type="text" name="salary" value="<s:property value="salary"/>"><br/>
①配置struts.xml文件
在struts2-core-2.2.1jar包下找到struts-default.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.configuration.xml.reload"value="true"></constant>
<packagename="system" namespace="/system" extends="struts-default">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven">
<param name="refreshModelBeforeResult ">true</param>
</interceptor-ref>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<action
name="user"
class="cn.com.leadfar.UserAction"
method="add"
>
<result name="add_input">/user/add_input.jsp</result>
<result name="success">/user/add_success.jsp</result>
<result name="update_input">/user/update_input.jsp</result>
</action>
</package>
</struts>
2.在UserAction里面的方法中添加
public String update_input(){
int id=user.getId();
user=new UserDao().findById(id);
CompoundRootroot=ActionContext.getContext().getValueStack().getRoot();
return "update_input";
}
(3)文件的上传
①值得注意的是在文件上传时,在Action类里面定义的中的uploadFile属性名必须与jsp页面上传的
File:<input type="file" name="uploadFile" ><br/> 保持一致
private File uploadFile;
private String uploadFileFileName
②当需要上传的文件保存在硬盘中的时候,可以这样做
public String addsuccess(){
try {
FileUtils.copyFile(uploadFile, new File("d:/temp/"+uploadFileFileName));
} catch (IOException e) {
e.printStackTrace();
}
return "addsuccess";
③当上传文件过大时,必须要在struts.xml文件中进行配置,否则报错
<constant name="struts.multipart.maxSize" value="318736010"></constant>
如果通过web上传文件过大(如超过100M),则必须用第三方插件(通讯软件),不能通过web上传!
通过web不稳定
④多文件上传定义成数字类型,或者集合类型
Action类
private File []uploadFile;
private String []uploadFileFileName;
public String addsuccess(){
if(uploadFile!=null){
for(int i=0;i<uploadFile.length;i++){
try {
FileUtils.copyFile(uploadFile[i], new File("d:/temp/"+uploadFileFileName[i]));
} catch (IOException e) {
e.printStackTrace();
}
}
}
ActionContext.getContext().put("upload", "上传成功");
return "addsuccess";
Jsp页面
File1:<input type="file" name="uploadFile" ><br/>
File2:<input type="file" name="uploadFile" ><br/>
File3:<input type="file" name="uploadFile" ><br/>
(4)struts2中的拦截器
①自定义LoginInterceptor继承AbstractInterceptor基类
public String intercept(ActionInvocation invocation) throws Exception {
String login=(String)ActionContext.getContext().getSession().get("login");
if(login==null){
return "login";
}
return invocation.invoke();
}
②修改配置文件,讲通用的拦截器,配置到comm.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.configuration.xml.reload" value="true"></constant>
<constant name="struts.multipart.maxSize" value="318736010"></constant>
<package name="comm" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="loginInterceptor" class="cn.com.leadfar.Actions.LoginInterceptor"></interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven">
<param name="refreshModelBeforeResult ">true</param>
</interceptor-ref>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
<interceptor-stack name="needLoginStack">(自定义拦截器,拦截自己定义的action)
<interceptor-ref name="exception"/>
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven">
<param name="refreshModelBeforeResult ">true</param>
</interceptor-ref>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="needLoginStack"></default-interceptor-ref>
<global-results><!--全局,如果登录失败继续返回index.jsp-->
<result name="login">/index.jsp</result>
</global-results>
</package>
</struts>
③在struct.xml中包含comm.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="comm.xml"></include>
<package name="system" namespace="/system" extends="comm">
<action name="login" class="cn.com.leadfar.Actions.LoginAction"> (login为LoginAction 里面的session中的key)
即:ActionContext.getContext().getSession().put("login",username);
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="index">/index.jsp</result>
<result name="login_success">/login_success.jsp</result>
</action>
</package>
</struts>