Action中<package>配置详解

本文详细介绍了Struts2框架中package元素的配置方法及其关键属性,包括name、extends、namespace和abstract等,帮助读者理解如何组织和管理Struts2应用程序。

package元素用于定义struts.xml中的包配置,<package>中可以定义action和拦截器等。使用package时一般须定义以下几个属性。

1、name

这个属性必须指定,代表包的名称,由于struts.xml可以定义不同不同的package,而且它们之间还可以相互引用,所以必须指定名称。

2、extends

这个属性是可选的,表示该包继承了其他的包,但是包信息的获取是配置文件中的先后顺序进行的,也就是说父包必须在子包之前定义。一般情况下都会继承一个名为“struts-default”的包,这个包是struts 2内置的。

3、namespace

该属性可选,用来指定一个命名空间,定义命名空间很简单,只要指定“namespace="/*"”就可以了,其中“*”是我们自定的。如果直接指定“"/"”,表示设置命名空间为根命名空间。如果不指定则为默认命名空间“""”。

设置了命名空间之后的页面请求也会发生改变,请求该为“命名空间名字/请求的action名”,此时框架会现在指定的命名空间中查找请求的action名,如果找不到就会在默认的命名空间中查找。当然了,如果你没有改页面请求,还是原来的“请求的action名”这样的请求,框架就会先在根命名空间中查找,如果找不到再去默认命名空间中查找。

4、abstract

该属性是可选的,定义该包是一个抽象包,不能包含<action>配置信息,但可以被继承。(个人感觉不出这个属性的用途,有人知道的话请告诉我。)

逐行解释下面代码:<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <package name="developer" extends="default"> <action name="changeUserLogin" class="com.smics.apps.erc.action.developer.ChangeUserLogin"> <result name="success" type="redirect">/user/toDo.action</result> </action> </package> <package name="erc" extends="default"> <action name="index" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="redirect">/user/toDo.action</result> </action> </package> <package name="user" extends="default" namespace="/user"> <action name="checkFormData" class="com.smics.apps.erc.action.user.CheckBack"> <result name="success"> <param name="contentType">text/xml</param> <param name="location">/user/checkRuncardStatus.ftl</param> </result> </action> <action name="viewLockInfo" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/unlockList.ftl</result> </action> <action name="unlockRuncard" class="com.smics.apps.erc.action.user.UnlockRuncard"> <interceptor-ref name="validationStack"/> <result name="success" type="redirect">/user/viewLockInfo.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/unlockList.ftl</result> </action> <action name="withdrawLockRuncard" class="com.smics.apps.erc.action.user.WithdrawLockRuncard"> <interceptor-ref name="validationStack"/> <result name="success" type="redirect">/user/viewLockInfo.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/unlockList.ftl</result> </action> <action name="eRuncardRule" class="com.smics.apps.erc.action.user.stepForm.RuncardInfoRule"> <result name="success" type="freemarker">/user/compareResult.ftl</result> <result name="input" type="freemarker">/user/previewRequestForm.ftl</result> </action> <action name="stepCompareRule" class="com.smics.apps.erc.action.user.stepForm.StepCompareRule"> <result name="success" type="freemarker">/user/stepCompareRule.ftl</result> </action> <action name="viewCompareInfo" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/compareResult.ftl</result> </action> <action name="checkStrLotStatus" class="com.smics.apps.erc.action.user.CheckStrLotStatus"> <result name="success" type="freemarker">/user/viewRequestForm.ftl</result> <result name="input" type="freemarker">/user/viewRequestForm.ftl</result> </action> <action name="showStepInfo" class="com.smics.apps.erc.action.user.ShowStepList"> <result name="success" type="freemarker">/user/showStepInfo.ftl</result> </action> <action name="updateWaferGroupResult" class="com.smics.apps.erc.action.user.UpdateWaferGroupResult"> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="copyRuncard" class="com.smics.apps.erc.action.user.CopyRuncard"> <result name="success" type="freemarker">/user/createNewErc.ftl</result> </action> <action name="viewCreateNewErc" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/viewCreateNewErc.ftl</result> </action> <action name="createNewErc" class="com.smics.apps.erc.action.user.CreateNewErc"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/viewCreateNewErc.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="updateRequestForm" class="com.smics.apps.erc.action.user.UpdateRequestForm"> <interceptor-ref name="validationStack"/> <result name="success" type="freemarker">/user/previewRequestForm.ftl</result> <!--result name="eRuncardRuleAll" type="redirect">eRuncardRuleAll.action?requestFormId=${requestForm.id}</result--> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <!--result name="input" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result--> <result name="signoff" type="freemarker">/user/viewWorkFlowEntry.ftl</result> </action> <action name="viewUpdateRequestForm" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/createNewErc.ftl</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> </action> <action name="saveRequestForm" class="com.smics.apps.erc.action.user.SaveRequestForm"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="updateHoldLotInfo" class="com.smics.apps.erc.action.user.UpdateHoldLotInfo"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="updateFormToClearLotInfo" class="com.smics.apps.erc.action.user.UpdateFormToClearLotInfo"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="updateFormForCompletedStepNo" class="com.smics.apps.erc.action.user.UpdateFormForCompletedStepNo"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="updateLotInfo" class="com.smics.apps.erc.action.user.UpdateLotInfo"> <!--result name="success" type="freemarker">/user/createNewErc.ftl</result--> <result name="success" type="redirect">viewUpdateRequestForm.action?requestFormId=${requestForm.id}</result> <result name="input" type="freemarker">/user/createNewErc.ftl</result> <result name="repeat" type="redirect">toDo.action</result> </action> <action name="showSelectModule" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/includeSelectModule.ftl</result> </action> <action name="showSelectMfg" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/includeSelectMfg.ftl</result> </action> <action name="showSingleSelectMfg" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/includeSingleSelectMfg.ftl</result> </action> <action name="showSelectE1" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/includeSelectE1.ftl</result> </action> <action name="searchLotOwnerId" class="com.smics.apps.erc.action.user.SearchLotOwnerId"> <result name="success" type="freemarker">/user/searchLotOwnerIdResult.ftl</result> </action> <action name="toDo" class="com.smics.apps.erc.action.user.ToDo"> <result name="success" type="freemarker">/user/toDo.ftl</result> <result name="input" type="freemarker">/user/toDo.ftl</result> </action> <action name="etAction" class="com.smics.apps.erc.action.user.etAction"> <result name="success" type="freemarker">/user/etcToDo.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="processed" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/processed.ftl</result> </action> <action name="myDrafts" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/myDrafts.ftl</result> </action> <action name="deleteDraft" class="com.smics.apps.erc.action.user.DeleteDraft"> <result name="success" type="redirect">myDrafts.action</result> <result name="input" type="freemarker">/user/myDrafts.ftl</result> </action> <action name="viewRequestForm" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/viewRequestForm.ftl</result> </action> <action name="submitRequestForm" class="com.smics.apps.erc.action.user.stepForm.SubmitRequestForm"> <interceptor-ref name="waitSession"/> <result name="success" type="redirect">/user/toDo.action</result> <result name="input" type="freemarker">/user/previewRequestForm.ftl</result> <result name="wait" type="freemarker">/user/waitSession.ftl</result> </action> <action name="continueRuncard" class="com.smics.apps.erc.action.user.stepForm.ContinueRuncard"> <interceptor-ref name="waitSession"/> <result name="success" type="redirect">/search/myApplications.action</result> <result name="input" type="freemarker">/user/previewRequestForm.ftl</result> </action> <action name="cancelRuncard" class="com.smics.apps.erc.action.user.stepForm.CancelRuncard"> <interceptor-ref name="waitSession"/> <result name="success" type="redirect">/user/myDrafts.action</result> <result name="input" type="freemarker">/user/previewRequestForm.ftl</result> </action> <action name="viewWorkFlowEntry" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/viewWorkFlowEntry.ftl</result> <result name="input" type="freemarker">/user/viewRequestForm.ftl</result> </action> <action name="deleteLastLog" class="com.smics.apps.erc.action.user.DeleteLastLog"> <!--result name="success" type="freemarker">/user/viewWorkFlowEntry.ftl</result--> <result name="success" type="redirect">/user/viewWorkFlowEntry.action?requestFormId=${requestForm.id}</result> </action> <action name="signOffRequestForm" class="com.smics.apps.erc.action.user.SignOffRequestForm"> <interceptor-ref name="waitSession"/> <result name="success" type="redirect">/user/toDo.action</result> <result name="bedone" type="freemarker">/user/viewRequestForm.ftl</result> <result name="input" type="freemarker">/user/viewWorkFlowEntry.ftl</result> <result name="wait" type="freemarker">/user/waitSession.ftl</result> </action> <action name="withDraw" class="com.smics.apps.erc.action.user.ApplicantWithDraw"> <interceptor-ref name="waitSession"/> <result name="success" type="redirect">/search/myApplications.action</result> <result name="input" type="freemarker">/user/viewRequestForm.ftl</result> <result name="wait" type="freemarker">/user/waitSession.ftl</result> </action> <action name="keyinWithDraw" class="com.smics.apps.erc.action.user.KeyinWithdraw"> <interceptor-ref name="waitSession"/> <result name="success" type="freemarker">/user/viewRequestForm.ftl</result> <result name="input" type="freemarker">/user/viewRequestForm.ftl</result> <result name="wait" type="freemarker">/user/waitSession.ftl</result> </action> <action name="keyInCloseRuncard" class="com.smics.apps.erc.action.user.KeyInCloseRuncard"> <result name="success" type="freemarker">/user/viewRequestForm.ftl</result> <result name="input" type="freemarker">/user/viewRequestForm.ftl</result> </action> <action name="checkStepNoExistInFecp" class="com.smics.apps.erc.action.user.CheckStepNoExistInFecp"> <result name="success" type="redirect">/success.xml</result> <result name="error" type="redirect">/error.xml</result> </action> <!-- for qtime --> <action name="comeinQTime" class="com.smics.apps.erc.action.user.ComeinQTimeAction"> <result name="success" type="freemarker">/user/qtime.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="comeinMainFlowQTime" class="com.smics.apps.erc.action.user.ComeinMainFlowQTimeAction"> <result name="success" type="freemarker">/user/qtimeMainFlow.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="addQTime" class="com.smics.apps.erc.action.user.AddQTimeAction"> <result name="success" type="redirect">comeinQTime.action?requestFormId=${requestForm.id}&groupResultId=${groupResult.id}</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="deleteQTime" class="com.smics.apps.erc.action.user.DeleteQTimeAction"> <result name="success" type="redirect">comeinQTime.action?requestFormId=${requestForm.id}&groupResultId=${groupResult.id}</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="addMainFlowQTime" class="com.smics.apps.erc.action.user.AddMainFlowQTimeAction"> <result name="success" type="redirect">comeinMainFlowQTime.action?requestFormId=${requestForm.id}&groupResultId=${groupResult.id}</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="deleteMainFlowQTime" class="com.smics.apps.erc.action.user.DeleteMainFlowQTimeAction"> <result name="success" type="redirect">comeinMainFlowQTime.action?requestFormId=${requestForm.id}&groupResultId=${groupResult.id}</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <!-- for qtime --> <action name="newRequest" class="com.smics.apps.erc.action.user.NewRequestAction"> <result name="success" type="freemarker">/user/viewCreateNewErc.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> <action name="popUpFetchStepInfo" class="com.smics.apps.erc.action.user.PEFetchStepComeinAction"> <result name="success" type="freemarker">/user/popUpFetchStepInfo.ftl</result> <result name="error" type="freemarker">/user/error.ftl</result> </action> </package> <!--StepForm function--> <package name="stepForm" extends="default" namespace="/stepForm"> <action name="showSpec" class="com.smics.apps.erc.action.user.stepForm.ShowSpec"> <result name="success" type="freemarker">/user/stepForm/viewSpecForm.ftl</result> <result name="input" type="freemarker">/user/stepForm/viewSpecForm.ftl</result> </action> <action name="viewStepForm" class="com.smics.apps.erc.action.user.stepForm.BaseStepFormAction"> <result name="success" type="freemarker">/user/stepForm/viewStepForm.ftl</result> </action> <action name="addStepForm" class="com.smics.apps.erc.action.user.stepForm.AddStepForm"> <result name="success" type="redirect">viewStepForm.action?requestFormId=${requestForm.id}&command=${command}&stepForm.area=${command}</result> <result name="input" type="freemarker">/user/stepForm/viewStepForm.ftl</result> </action> <action name="deleteStepForm" class="com.smics.apps.erc.action.user.stepForm.DeleteStepForm"> <result name="success" type="redirect">viewStepForm.action?requestFormId=${requestForm.id}&command=${command}&stepForm.area=${command}</result> </action> <action name="showOvl" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/stepForm/includeOvlData.ftl</result> </action> <action name="showWaferId" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/stepForm/waferAndSlotId.ftl</result> </action> <action name="showWaferIdStr" class="com.smics.apps.erc.action.user.stepForm.BaseStepFormAction"> <result name="success" type="freemarker">/user/stepForm/waferAndSlotIdStr.ftl</result> </action> <action name="showSlotId" class="com.smics.apps.erc.action.user.UserBaseAction"> <result name="success" type="freemarker">/user/stepForm/waferAndSlotId.ftl</result> </action> <action name="showSlotIdStr" class="com.smics.apps.erc.action.user.stepForm.BaseStepFormAction"> <result name="success" type="freemarker">/user/stepForm/waferAndSlotIdStr.ftl</result> </action> <action name="changeArea" class="com.smics.apps.erc.action.user.stepForm.ChangeArea"> <result name="success" type="freemarker">/user/stepForm/viewStepForm.ftl</result> </action> <action name="printRuncard" class="com.smics.apps.erc.action.user.stepForm.PrintRuncard"> <result name="success" type="freemarker">/user/stepForm/printRuncard.ftl</result> <result name="error" type="freemarker">/user/stepForm/error.ftl</result> </action> <action name="viewPrintRuncard" class="com.smics.apps.erc.action.user.stepForm.ViewPrintRuncard"> <result name="success" type="freemarker">/user/stepForm/viewPrintRuncard.ftl</result> <result name="input" type="freemarker">/user/stepForm/viewRequestForm.ftl</result> </action> <action name="updateStepInfo" class="com.smics.apps.erc.action.user.stepForm.UpdateStepInfo"> <result name="success" type="freemarker">/user/stepForm/viewStepForm.ftl</result> <result name="input" type="freemarker">/user/stepForm/viewStepForm.ftl</result> </action> </package> <!--Admin function--> <package name="admin" extends="default" namespace="/admin"> <action name="viewSpecialInfo" class="com.smics.apps.erc.action.admin.specialDuty.BaseDutyInfo"> <result name="success" type="freemarker">/specialDuty/viewSpecialDutyInfo.ftl</result> </action> <action name="addSpecialEmployee" class="com.smics.apps.erc.action.admin.specialDuty.AddSpecialEmployee"> <result name="success" type="redirect">viewSpecialInfo.action</result> <result name="input" type="freemarker">/specialDuty/viewSpecialDutyInfo.ftl</result> </action> <action name="deleteSpecialDutyInfo" class="com.smics.apps.erc.action.admin.specialDuty.DeleteSpecialDutyInfo"> <result name="success" type="redirect">viewSpecialInfo.action</result> <result name="input" type="freemarker">/specialDuty/viewSpecialDutyInfo.ftl</result> </action> <action name="viewMaintainInfo" class="com.smics.apps.erc.action.admin.QEMaintain.BaseQEMaintain"> <interceptor-ref name="validationStack"/> <result name="success" type="freemarker">/QEMaintain/viewMaintainInfo.ftl</result> </action> <action name="maintainInfo" class="com.smics.apps.erc.action.admin.QEMaintain.MaintainInfo"> <result name="success" type="redirect">viewMaintainInfo.action</result> <result name="input" type="freemarker">/QEMaintain/viewMaintainInfo.ftl</result> </action> <action name="index" class="com.smics.apps.erc.action.admin.BaseSuperAdminActon"> <result name="success" type="freemarker">/admin/index.ftl</result> </action> <action name="viewDefineFab" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/defineFab.ftl</result> </action> <action name="defineFab" class="com.smics.apps.erc.action.admin.SetFabId"> <interceptor-ref name="validationStack"/> <result name="success" type="redirect">viewDefineFab.action</result> <result name="input" type="freemarker">/admin/defineFab.ftl</result> </action> <action name="viewAreaList" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/addAreaList.ftl</result> </action> <action name="addAreaList" class="com.smics.apps.erc.action.admin.AddAreaList"> <interceptor-ref name="validationStack"/> <result name="success" type="redirect">viewAreaList.action</result> <result name="input" type="freemarker">/admin/addAreaList.ftl</result> </action> <action name="deleteAreaList" class="com.smics.apps.erc.action.admin.DeleteAreaList"> <result name="success" type="redirect">viewAreaList.action</result> <result name="error" type="freemarker">/admin/addAreaList.ftl</result> </action> <action name="viewRoleMembers" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/addRoleMembers.ftl</result> </action> <action name="addRoleMember" class="com.smics.apps.erc.action.admin.AddRoleMember"> <result name="success" type="redirect">viewRoleMembers.action</result> <result name="input" type="freemarker">/admin/addRoleMembers.ftl</result> </action> <action name="deleteRoleMember" class="com.smics.apps.erc.action.admin.DeleteRoleMember"> <result name="success" type="redirect">viewRoleMembers.action</result> <result name="error" type="freemarker">/admin/addRoleMembers.ftl</result> </action> <action name="viewMaximumOfSteps" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/addMaximumOfSteps.ftl</result> </action> <action name="addMaximumOfSteps" class="com.smics.apps.erc.action.admin.AddMaximumOfSteps"> <result name="success" type="redirect">viewMaximumOfSteps.action</result> <result name="input" type="freemarker">/admin/addMaximumOfSteps.ftl</result> </action> <action name="deleteMaximumOfSteps" class="com.smics.apps.erc.action.admin.DeleteMaximumOfSteps"> <result name="success" type="redirect">viewMaximumOfSteps.action</result> <result name="error" type="freemarker">/admin/addMaximumOfSteps.ftl</result> </action> <action name="viewChangOwnerInfo" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/changeCurrentOwner.ftl</result> </action> <action name="changeCurrentOwner" class="com.smics.apps.erc.action.admin.ChangeSignerOff"> <result name="success" type="freemarker">/admin/changeCurrentOwner.ftl</result> <result name="input" type="freemarker">/admin/changeCurrentOwner.ftl</result> </action> <action name="viewCancelRuncardForm" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/cancelRuncardByType.ftl</result> </action> <action name="cancelRuncardByType" class="com.smics.apps.erc.action.admin.CancelRuncardByType"> <interceptor-ref name="validationStack"/> <result name="success" type="freemarker">/admin/cancelRuncardByType.ftl</result> <result name="view" type="redirect">/user/viewRequestForm.action?requestFormId=${ercFormId}&strMessage=${message}</result> <result name="input" type="freemarker">/admin/cancelRuncardByType.ftl</result> </action> <action name="viewChangRuncardStatus" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/viewChangRuncardStatus.ftl</result> </action> <action name="changeRuncardStatus" class="com.smics.apps.erc.action.admin.ChangeRCStatus"> <interceptor-ref name="validationStack"/> <result name="success" type="freemarker">/admin/viewChangRuncardStatus.ftl</result> <result name="input" type="freemarker">/admin/viewChangRuncardStatus.ftl</result> </action> <action name="viewReportYear" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">/admin/reportYear.ftl</result> </action> <action name="addReportYear" class="com.smics.apps.erc.action.admin.AddReportYear"> <interceptor-ref name="validationStack"/> <result name="success" type="redirect">viewReportYear.action</result> <result name="input" type="freemarker">/admin/reportYear.ftl</result> </action> <action name="deleteReportYear" class="com.smics.apps.erc.action.admin.DeleteReportYear"> <result name="success" type="redirect">viewReportYear.action</result> <result name="error" type="freemarker">/admin/reportYear.ftl</result> </action> <action name="viewBrotherOrgs" class="com.smics.apps.erc.action.admin.BaseAdminAction"> <result name="success" type="freemarker">admin/brotherOrgs.ftl</result> <result name="error" type="freemarker">/admin/brotherOrgs.ftl</result> </action> <action name="addBrotherOrg" class="com.smics.apps.erc.action.admin.AddBrotherOrg"> <result name="success" type="redirect">viewBrotherOrgs.action</result> <result name="error" type="freemarker">/admin/brotherOrgs.ftl</result> </action> <action name="deleteBrotherOrg" class="com.smics.apps.erc.action.admin.DeleteBrotherOrg"> <result name="success" type="redirect">viewBrotherOrgs.action</result> <result name="error" type="freemarker">/admin/brotherOrgs.ftl</result> </action> </package> <!--MFG Manager function--> <package name="mfgAssigner" extends="default" namespace="/mfgAssigner"> <action name="viewMaintainAssigner" class="com.smics.apps.erc.action.mfgAssigner.BaseAssignerAction"> <interceptor-ref name="validationStack"/> <result name="success" type="freemarker">/mfgAssigner/maintainAssigner.ftl</result> </action> <action name="maintainAssigner" class="com.smics.apps.erc.action.mfgAssigner.MaintainAssigner"> <result name="success" type="redirect">viewMaintainAssigner.action</result> <result name="input" type="freemarker">/mfgAssigner/maintainAssigner.ftl</result> </action> <action name="viewAssigner" class="com.smics.apps.erc.action.mfgAssigner.BaseAssignerAction"> <result name="success" type="freemarker">/mfgAssigner/updateAssigner.ftl</result> </action> <action name="updateAssigner" class="com.smics.apps.erc.action.mfgAssigner.UpdateAssigner"> <result name="success" type="redirect">viewMaintainAssigner.action</result> <result name="input" type="freemarker">/mfgAssigner/maintainAssigner.ftl</result> </action> <action name="deleteAssigner" class="com.smics.apps.erc.action.mfgAssigner.DeleteAssigner"> <result name="success" type="redirect">viewMaintainAssigner.action</result> <result name="input" type="freemarker">/mfgAssigner/maintainAssigner.ftl</result> </action> </package> <!--Search function--> <package name="search" extends="default" namespace="/search"> <action name="index" class="com.smics.apps.erc.action.search.SearchBaseAction"> <result name="success" type="freemarker">/search/index.ftl</result> </action> <action name="doSearch" class="com.smics.apps.erc.action.search.DoSearch"> <result name="success" type="freemarker">/search/index.ftl</result> </action> <action name="searchResultToExcel" class="com.smics.apps.erc.action.search.DoSearch"> <result name="success" type="freemarker"> <param name="contentType">application/vnd.ms-excel</param> <param name="location">/search/exportToExcel.ftl</param> </result> <result name="input" type="freemarker">/search/indexForReport.ftl</result> </action> <action name="reportIndex" class="com.smics.apps.erc.action.search.SearchBaseAction"> <result name="success" type="freemarker">/search/report.ftl</result> </action> <action name="exportReportByMode" class="com.smics.apps.erc.action.search.ReportByMode"> <result name="week" type="excel">/search/reportWeek.xls</result> <result name="month" type="excel">/search/reportMonth.xls</result> <result name="input" type="freemarker">/search/report.ftl</result> </action> <action name="myApplications" class="com.smics.apps.erc.action.search.MyApplication"> <result name="success" type="freemarker">/search/myApplications.ftl</result> </action> <action name="processed" class="com.smics.apps.erc.action.search.Processed"> <result name="success" type="freemarker">/search/processed.ftl</result> </action> </package> </xwork>
08-30
# 题目重述 根据《第三次实验-使用会话技术记录用户登录状态.docx》的要求,构建一个完整的 Web 应用系统,实现基于 **Session** 的用户登录状态管理。要求从零开始搭建项目结构、创建必要文件(HTML、JSP、Servlet、JavaBean 等),并通过会话技术控制资源访问权限:未登录用户无法访问 `index.jsp`,登录后可访问并能注销。 --- # 详解 ## ✅ 第一步:创建 Maven Web 项目 ### 1. 打开 IntelliJ IDEA → New Project → Maven Archetype 选择:`maven-archetype-webapp` 填写项目信息: - GroupId: `com.example` - ArtifactId: `session-demo` - Version: `1.0-SNAPSHOT` 点击“Finish”,生成基础 Web 项目。 ### 2. 补全目录结构(手动创建) Maven 默认不生成某些目录,需手动补全: ``` src └── main ├── java ← 新建此目录(标记为 Sources Root) ├── resources ← 新建此目录(标记为 Resources Root) └── webapp ├── WEB-INF │ └── web.xml ├── login.html ← 创建 └── index.jsp ← 创建 ``` 右键 `java` 目录 → Mark Directory as → **Sources Root** --- ## ✅ 第二步:配置 `pom.xml` 添加依赖 编辑 `pom.xml`,添加 Servlet、JSP、JSTL 支持(注意 Tomcat 10+ 使用 Jakarta 命名空间): ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>session-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <failOnMissingWebXml>false</failOnMissingWebXml> </properties> <dependencies> <!-- Jakarta Servlet API --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <!-- Jakarta JSP API --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>10.1.0</version> <scope>provided</scope> </dependency> <!-- Jakarta JSTL --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.0</version> </dependency> </dependencies> <build> <finalName>session-demo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project> ``` > 💡 提示:若使用本地 Tomcat,可忽略插件部分,直接部署到外部服务器。 --- ## ✅ 第三步:创建前端登录页面 `login.html` 路径:`src/main/webapp/login.html` ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>用户登录</title> </head> <body style="font-family: Arial;"> <h3>请登录</h3> <form action="login" method="post"> 用户名:<input type="text" name="username" required><br><br> 密码:<input type="password" name="password" required><br><br> <input type="submit" value="登录"> </form> </body> </html> ``` --- ## ✅ 第四步:创建主资源页面 `index.jsp` 路径:`src/main/webapp/index.jsp` ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>欢迎页</title> </head> <body style="font-family: Arial;"> <!-- 判断用户是否已登录 --> <c:if test="${user == null}"> <c:redirect url="login.html"/> </c:if> <h3>登录成功!欢迎您,${user.name}!</h3> <p><a href="logout">【注销】</a></p> </body> </html> ``` > 🔍 原理:利用 EL 表达式 `${user}` 检查 Session 中是否存在用户对象,不存在则跳转。 --- ## ✅ 第五步:创建 JavaBean 类 `User.java` 路径:`src/main/java/com/example/entity/User.java` ```java package com.example.entity; public class User { private String username; private String name; public User(String username, String name) { this.username = username; this.name = name; } // Getters and Setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` > ⚠️ 包名建议规范:`com.example.entity` 或 `bean` --- ## ✅ 第六步:创建三个核心 Servlet ### ① LoginServlet.java —— 处理登录请求 路径:`src/main/java/com/example/servlet/LoginServlet.java` ```java package com.example.servlet; import com.example.entity.User; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.*; import java.io.IOException; @WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 模拟认证(生产环境应查数据库) if ("admin".equals(username) && "123456".equals(password)) { User user = new User(username, "管理员"); HttpSession session = request.getSession(); session.setAttribute("user", user); session.setMaxInactiveInterval(30 * 60); // 30分钟 // 将 JSESSIONID 写入 Cookie Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setPath("/"); cookie.setMaxAge(30 * 60); // 与 session 一致 response.addCookie(cookie); response.sendRedirect("index.jsp"); } else { response.setContentType("text/html;charset=utf-8"); response.getWriter().println("登录失败,请重新登录!<br><a href='login.html'>返回登录页</a>"); } } } ``` --- ### ② LogoutServlet.java —— 处理注销请求 路径:`src/main/java/com/example/servlet/LogoutServlet.java` ```java package com.example.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.*; import java.io.IOException; @WebServlet("/logout") public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if (session != null) { session.removeAttribute("user"); // 清除用户 // 可选:session.invalidate(); 销毁整个会话 } response.sendRedirect("login.html"); } } ``` --- ### ③ (可选)ResourceServlet —— 统一资源入口控制(替代JSP判断) 本实验中由 `index.jsp` 自行判断,故非必需。但可用于更复杂场景。 --- ## ✅ 第七步:配置 `web.xml`(可选,现代Servlet可省略) 路径:`src/main/webapp/WEB-INF/web.xml` ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- 设置会话超时时间为30分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app> ``` > 📝 注解方式已取代大部分XML配置,但 `session-timeout` 在 `web.xml` 中设置更直观。 --- ## ✅ 第八步:部署与运行 ### 方式一:使用内置插件运行(推荐学习阶段) 在命令行执行: ```bash mvn tomcat7:run ``` 访问地址:`http://localhost:8080/session-demo/login.html` ### 方式二:部署到本地 Tomcat 1. 编译打包:`mvn clean package` 2. 将生成的 `target/session-demo.war` 放入 `$TOMCAT_HOME/webapps/` 3. 启动 Tomcat:`startup.bat` 或 `startup.sh` 4. 访问:`http://localhost:8080/session-demo/login.html` --- ## ✅ 第九步:测试功能 | 测试项 | 操作 | 预期结果 | |-------|------|---------| | 未登录访问 index.jsp | 直接输入 URL | 自动跳转到 `login.html` | | 正确登录 | 用户名=admin, 密码=123456 | 跳转至 `index.jsp` 显示欢迎语 | | 点击“注销” | 点击链接 | Session 清除,跳回登录页 | | 重新访问 index.jsp | 不登录直接访问 | 再次跳转登录页 | | 30分钟内关闭浏览器再打开 | 保留 Cookie | 若 Session 未失效仍可访问 | --- # 知识点 ## 1. **HttpSession 会话管理** 服务器通过 HttpSession 存储用户状态,实现跨请求的身份识别,是保障安全访问的核心机制。 ## 2. **Cookie 与 Session 协同机制** Cookie 存储 JSESSIONID,使得客户端能持续持有会话凭证,从而维持登录状态。 ## 3. **JSP + JSTL + EL 表达式联合控制流程** 使用 `${user}` 获取 Session 属性,结合 `<c:if>` 和 `<c:redirect>` 实现页面级权限控制,增强安全性与可维护性。请再实现一下注册的功能
最新发布
11-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值