Struts2基础知识:
Struts2的相关配置文件
在struts2的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>
其中,org.apache.struts2.dispatcher.FilterDispatcher是一个过滤器,能够自动找到struts的配置文件,即struts.xml配置文件。所有*.action请求经过FilterDispatcher,在struts.xml中找到对应的action进行处理。
在struts.xml配置文件中,部分代码编写如下:
<package name="cbsst" extends="struts-default">
<interceptors>
<interceptor name="CBSSTAuthorization"
class="frame.interceptor.AuthorizationInterceptor" />
<interceptor-stack name="CBSSTStack">
<interceptor-ref name="exception" />
<!-- interceptor-ref name="CBSSTAuthorization" /-->
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="prepare" />
<interceptor-ref name="i18n" />
<interceptor-ref name="chain" />
<interceptor-ref name="debugging" />
<interceptor-ref name="profiling" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload" />
<interceptor-ref name="checkbox" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="params">
<param name="excludeParams">dojo"..*</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="CBSSTStack" /></package>
<interceptors>标签下是一系列的拦截器,主要是拦截用户发送的请求。
<package>name属性指明一个包名称,"struts-default.xml"存在于struts-action-x.x.jar包中,用extends属性将其引入。
<include>标签表示引入一个文件,例如:<include file="struts_frame.xml" />
表示将struts_frame.xml文件引入到该文件当中。
<global-results>标签表示配置一个全局的action的返回结果,如下例:
<global-results>
<result name="Error">/view/crm/common/Error.jsp</result> <resultname="success">/view/crm/common/Success.jsp</result>
</global-results>
表示配置两个全局的"Error"和"success",即所有的action都在其作用范围内,当一个action的返回结果是"Error",就会跳转到/view/crm/common/Error.jsp页面。
当然,这种全局的action的返回结果没有局部的action的返回结果的权利大。如果定义了一个局部的action,如下:
<action name="crm.project.ProjectAction.addSaveProject"
method="addSaveProject" class="crm.action.project.ProjectAction">
<result name="success" type="redirect-action">
crm.project.ProjectAction.listProject</result>
<result name=" Error">/view/crm/common/ErrorMessage.jsp
</result>
</action>
如果此action的返回结果为" Error",页面会跳转到/view/crm/ErrorMessage.jsp
而不会跳转到全局的action返回结果中。name属性指明action的名称,class指明类的id(在spring配置文件中定义),method指明用类中的addSaveProject方法处理该action。<result>标签指明返回结果,上面的action有两个返回结果,"success"和" Error"。
页面显示相关
4.1 标签和文件的引入
1)引入struts的标签库
<%@ taglib prefix="s" uri="/struts-tags"%>
2)引入css式样表
<link rel="stylesheet" type="text/css" href="style/common/Main01.css">
3)引入js文件
<script type="text/javascript" src="js/crm/project/addProject.js"></script>
4.2页面动态显示
1) radio被动态选中
<s:radio list="#{'1':'大','2':'中','3':'小'}" listKey="key"
listValue="value" name="project.sizeId" value="${project.sizeId }"></s:radio>
实现了由action中传入一个project.sizeId的值,radio自动选中与之相匹配的项。
2) selsect中的option被动态选中
<s:select list="#{'1':'PG','2':'SE','3':'TL','4':'SL','5':'PL','6':'PM'}
listKey="key"list Value="value"name="projectDeveloper" value="${actor }" >
</s:select>
实现了由action中传入一个actor的值,option自动选中与之相匹配的项。
3) 多个复选框被动态选中
<s:checkboxlist name="technologyIds" list="technologys" listKey="technologyId" listValue="technologyName" value="technologyIds" />
实现了在链表st="technologys"中,如果有匹配数组value="technologyIds"中的值,则这些复选框被动态选中。
4.3 javascript在页面显示中的应用
1)数据校验
例如校验项目id:
首先,通过id得到对象
var projectId = document.getElementById("projectId");
其次,对数据进行校验,如果有错就给出提示,直到没有错,就提交表单。
if(i==0&&projectId.value=="")
{ i=1;
alert("项目编号不能为空");
}else f(i==0&&(projectId.value.length<4||projectId.value.length>25))
{ i=1;
alert("项目编号长度必须在4到25之间");
2)提交表单
经过数据校验,数据合格后,提交表单
if(i==0)
{
form.action = "crm.project.ProjectAction.addSaveProject.action";
form.submit();
}
3)向table中动态增加一行
实现相table中动态增加一行的功能,用到了innerHTML和innerText。
首先,通过id得到table对象
var tab = document.getElementById("developer");
然后,插入新的一行到tab的第一行
var newTr0 = tab.insertRow(0);
其次,增加两列
var newTd0 = newTr0.insertCell();
var newTd1 = newTr0.insertCell();
最后,设置两列的属性
newTd0.innerText='开发人编号:';
newTd1.innerHTML ='<input type="text" name="projectDeveloper" >';