struts2的使用,struts2框架
偶然在查看文档时,看到这个演示,后来认真看了下真是麻雀虽小,很单一的支柱2的增删改查,但是却从各方面诠释着支柱2这一开源框架的精妙设计和丰富的可定制性。文档上提供是片段式的代码讲解,且是英文的,所以这里记录一下,方面以后查看。
和以前一样,先上效果图:
图一:
publiclassdepartmentimplementsselizable {
IntegerdepartmentId
字符串名称
公共部门(){
}
公共部门(整数部门id,字符串名称){
这个。departmentId=departmentId
this.name=name
}
publicIntegergetDepartmentId(){
return部门Id
}
publicvidsetdepartmentid(IntegerdepartmentId){
这个。departmentId=departmentId
}
publicStringgetName(){
returnname
}
publicvoidsetName(Stringname){
this.name=name
}
}
公共类employeeimplementsserializable {
privateIntegeremployeeId
私人集成电路
privateStringfirstName
privateStringlastName
私营部门;
公共雇员(){
}
公共雇员(IntegeremployeeId,StringfirstName,StringlastName,
积分,部门部门){
this.employeeId=employeeId
这个。名字=名字;
this.lastName=姓氏;
this.age=年龄;
this.department=部门;
}
公共部门getdepartment(){
返回部门;
}
publicvoidsetDepartment(部门部门){
this.department=部门;
}
publicIntegergetEmployeeId(){
returnemployeeId
}
publicvidsetemployeeid(IntegeremployeeId){
this.employeeId=employeeId
}
publicIntegergetAge(){
退货;
}
publicvoidsetAge(Integerage){
this.age=年龄;
}
publicStringgetFirstName(){
返回名字
}
publicfoidset first name(string first name){
这个。名字=名字;
}
publicStringgetLastName(){
return姓氏
}
publicvoidsetLastName(string last name){
this.lastName=姓氏;
}
}
publicinterfaceDepartmentDao{
publicListgetAllDepartments();
publicMapgetDepartmentsMap();
}
公共界面员工道{
publicListgetAllEmployees();
publicEmployeegetEmployee(Integerid);
publicaudepupdate(Employeeemp);
publicvoidinsert(Employeeemp);
public void delete(整数id);
}
publiclassdepartmentnodbdaoimplementsdepartmentdao {
privatestaticListdepartments
privateststaticmapdepartmentsmap;
静态{
departments=new ArrayList();
部门。add(新部门(新整数(100),会计));
部门。add(新部门(新整数(200), R D ));
部门。add(新部门(新整数(300),销售));
departments map=new hashmap();
迭代器=部门。迭代器();
while(iter.hasNext()){
部门dept=(部门)ITER。next();
部门地图。put(dept . getdepartmentid(),dept);
}
}
publicListgetAllDepartments(){
返回部门;
}
publicMapgetDepartmentsMap(){
返回部门地图
}
}
导入组织。阿帕奇。公地。伐木。日志;
导入组织。阿帕奇。公地。伐木。原木工厂;
导入com。奥里法。struts 2。教程。模型。部门;
导入com。奥里法。struts 2。教程。模型。员工;
publicclassemployeenodbdao实现sempyeedao {
privateststaticmapdepartmentsmap;
privatestaticArrayListemployees雇员
静态{
employees=newArrayList();
员工。add(新员工(新整数(1), John , Doe ,newInteger(36),newDepartment(newInteger(100), Accounting ));
员工。add(新雇员(新整数(2),鲍勃,史密斯,新整数(25),新部门(新整数(300),销售));
DepartmentDaodeptDao=newDepartmentNoDBdao();
部门图=部门道。get departments map();
}
日志记录器=日志工厂。获取日志(此。getclass());
publicListgetAllEmployees(){
返回员工;
}
publiceemployeegemployee(整数id){
Employeeemp=null
迭代器=雇员。迭代器();
while(iter.hasNext()){
雇员=ITER。next();
if(emp.getEmployeeId().等于(id)){
打破;
}
}
returnemp
}
public avoid update(employee EMP){
整数id=EMP。getemployeeid();
for(inti=0;一、员工。size();i ){
雇员温度=(雇员)雇员。get(I);
if(tempEmp.getEmployeeId().等于(id)){
电磁脉冲。设置部门((部门)部门图。获取(EMP。获取部门().getDepartmentId()));
employees.set(i,EMP);
打破;
}
}
}
publicvoidinsert(Employeeemp){
int lastid=0;
迭代器=雇员。迭代器();
while(iter.hasNext()){
Employeetemp=(雇员)ITER。next();
if(temp.getEmployeeId().intValue() lastId){
lastId=temp.getEmployeeId().int value();
}
}
电磁脉冲。设置部门((部门)部门图。获取(EMP。获取部门().getDepartmentId()));
电磁脉冲。setemployeeid(新整数(lastId 1));
员工。添加(EMP);
}
publicvoiddelete(Integerid){
for(inti=0;一、员工。size();i ){
雇员温度=(雇员)雇员。get(I);
if(tempEmp.getEmployeeId().等于(id)){
员工。删除;
打破;
}
}
}
}
第四步,根据大刀层,完成服务层(因为代码较为简单,未明确分包),代码如下:
导入com。奥里法。struts 2。教程。道。部道;
导入com。奥里法。struts 2。教程。道。departmentnodbdao
publiclassdepartmentdaoserviceimplementsdepartmentservice {
privateddepartmentdaodao
publicDepartmentDaoService(){
这个。Dao=newDepartmentNoDBdao();
}
publicListgetAllDepartments(){
还刀。getall departments();
}
}
导入com。奥里法。struts 2。教程。道。员工道;
导入com。奥里法。struts 2。教程。道。employeenodbdao
导入com。奥里法。struts 2。教程。模型。员工;
publicclassEmployeeDaoServiceimplementsEmployeeService {
privateeemployeedaodao
publicEmployeeDaoService(){
这个。Dao=newEmployeeNoDBdao();
}
publicListgetAllEmployees(){
还刀。getallemployees();
}
publicvoidupdateEmployee(Employeeemp){
道。更新(EMP);
}
publicviddeleteemployee(整数id){
道。删除(id);
}
publiceemployeegemployee(整数id){
还刀。获取员工(id);
}
publicfoidinserteemployee(Employeeemp){
道。插入(EMP);
}
}
公共接口部门服务{
publicListgetAllDepartments();
}
公共接口employeeservice {
publicListgetAllEmployees();
publicvoidupdateEmployee(Employeeemp);
publicviddeleteemployee(整数id);
publicEmployeegetEmployee(Integerid);
publicfoidinserteemployee(Employeeemp);
}
导入组织。阿帕奇。公地。伐木。日志;
导入组织。阿帕奇。公地。伐木。原木工厂;
导入com。奥里法。struts 2。教程。模型。员工;
导入com。奥里法。struts 2。教程。服务。departmentdaoservice
导入com。奥里法。struts 2。教程。服务。部门服务;
导入com。奥里法。struts 2。教程。服务。employeedaoservice
导入com。奥里法。struts 2。教程。服务。员工服务;
导入com。开放式交响乐。xwork 2。行动支持;
导入com。开放式交响乐。xwork 2。可准备的;
publicclassemployeeactionextendsactionsupportimplementspreadable {
/**
*
*/
privatestaticfinallonserialversionuid=-6886717038958304064 l;
日志工厂。获取日志(此。getclass());
privatesticemployeeserviceempservice=newEmployeeDaoService();
privateststaticdepartmentservicedeptservice=newDepartmentDaoService();
privateeemployeeeemployee
私人雇员;
私人部门;
publicvoidprepare()抛出异常{
部门=deptservice。getall departments();
如果(员工!=null employee.getEmployeeId()!=null){
员工=empservice。获取员工(员工。get employeeid());
}
}
publicStringdoSave(){
如果(员工。getemployeeid()==null){
empService.insertEmployee(雇员);
}否则{
empService.updateEmployee(员工);
}
return成功
}
publicStringdoDelete(){
empservice。删除员工(员工。getemployeeid());
return成功
}
publicStringdoList(){
员工=empservice。getalleemployees();
return成功
}
publicStringdoInput(){
返回输入输入;
}
/**
* @ returns返回雇员。
*/
publicEmployeegetEmployee(){
返回雇员;
}
/**
* @ paramemployee
*员工集合。
*/
publicfavoidsetemployee(employeeeemployee){
this.employee=雇员;
}
/**
* @ returns返回雇员。
*/
publicListgetEmployees(){
返回员工;
}
/**
* @ returnReturnsthedepartments .
*/
publicListgetDepartments(){
返回部门;
}
}
!DOCTYPEvalidatorsPUBLIC -//OpenSymphonyGroup//xwork验证器1。0 .2//EN
http://www。开放式交响乐。xwork/xwork-validator-1。0 .2 . dtd
验证器
字段名=雇员。名字
字段验证器类型=必需字符串
消息键=错误。必需的。名字/
/字段验证器
/字段
字段名=雇员。姓氏
字段验证器类型=必需字符串
消息键=错误。必需的。姓氏/
/字段验证器
/字段
fieldname=employee.age
field-validatortype=必填短路=真
消息键=错误。必需的。年龄/
/字段验证器
field-validatortype=int
paramname=min 18 /param
paramname=max 65 /param
消息键=错误。必需的。年龄。限制/
/字段验证器
/字段
/验证器
至此,代码部分大抵完成,下面在科学研究委员会下,新建所需的配置文件:
首先是log4j,代码如下:
?xmlversion=1.0 编码=UTF八号?
!doctype log 4j:配置系统“log 4j。dtd "
log4j:配置xmlns:log4j= http://雅加达。阿帕奇。org/log4j/
appendername=stdout
布局/
/appender
!-日志详细信息配置-
记录器名称= com。开放式交响乐。 xwork
levelvalue=error/
appender-refref=stdout/
/记录器
记录器名称= com。开放式交响乐。网络工作
levelvalue=error/
appender-refref=stdout/
/记录器
loggername=freemarker
levelvalue=warn/
appender-refref=stdout/
/记录器
loggername=com.mevipro
levelvalue=debug/
appender-refref=stdout/
/记录器
根
levelvalue=error/
appender-refref=stdout/
/root
/log4j:配置
!文档类型结构公共
-//Apache software foundation//dtdstrutsconfiguration 2.0//EN
http://支柱。阿帕奇。org/dtds/struts-2.0。 dtd
支杆
!-includebworkdefault(来自theStrutsJAR).-
包含file= struts-default。XML /
!-Configurationforthedefaultpackage .-
包名称= default 扩展= struts-default
!- Defaultinterceptorstack .-
default-interceptor-refname= paramspreparamstack /
actionname=index method=list
结果名称=成功/JSP/employees . JSP/结果
!-我们没有完整的堆叠在这里-
interceptor-refname=基本堆栈/
/操作
actionname=crud method=input
结果名称=成功类型=重定向操作索引/结果
结果名称=输入/JSP/员工表单。JSP/结果
resultname= error /JSP/error。JSP/结果
/操作
/包
/struts
然后是支杆的国际化文件,struts.properties和来宾。属性,代码分别如下:
申请。title=employeemamentanceapplication
label.employees=雇员
label.delete=删除
label.edit=编辑
label.employee.edit=编辑员工编辑员工
标签。雇主。添加=添加员工
标签.名字=名字
标签.姓氏=姓氏
标签.部门=部门
label.age=年龄
#按钮标签
button.label.submit=提交提交
button.label.cancel=取消取消
## -错误
错误。前缀=span
错误。后缀=/span
错误。general=anerrorhasoccured
错误。必需的。名字=姓名是必填项。
错误。必需的。last name=last name is必需.
错误。必需的。年龄=请提供年龄.
错误。必需的。年龄。limit=pleaseprovideanage介于$ { min }和${max}之间。
错误。必需的。部门=部门是必需的.
% @页语言= Java 导入= Java。util。* "页面编码= UTF-8 %
%
字符串路径=请求。getcontextpath();
StringbasePath=请求。get scheme()://请求。获取servername()“:”请求。获取服务器端口()路径“/”;
%
! DOCTYPEHTMLPUBLIC -//W3C//dtdhtml 4.01过渡版//EN
超文本标记语言
头
basehref= %=basePath%
标题MyJSPindex.jsp 开始页面/标题
meta http-equiv= pragma content= no-cache
meta http-equiv= cache-control content= no-cache
元http-equiv= expires content= 0
meta http-equiv= keywords content= keyword 1,keyword2,keyword3
meta http-equiv= Refresh content= 0; URL=index.action
!-
linkrel=样式表 type= text/CSS href=样式。 CSS
-
/头
身体
这是我的页面.英国铁路公司
/body
/html
% @页内容类型= text/html;charset=UTF-8 语言=java%
% @ taglibprefix= s uri=/struts-tags %
s:if test= employee==null employee。employeeid==null
s:set name= title value= % { add new employee } /
/s:如果
学生:否则
s:set name= title value= % { update employee } /
/s:否则
超文本标记语言
头
link href= CSS/main。CSS rel=样式表 type= text/CSS /
样式td {空白:nowrap}/样式
标题s:属性值= # title //title
/头
身体
应用程序。标题//div
h1 s:propertyvalue=#title//h1
% - s:actionerror/- %
% - s:actionmessage/- %
s:for action= crud!"保存.操作"方法="post "
s:textfield name= employee。名值= % {雇员。first name }“label=”% { getText( label。名字)} size= 40 /
s:textfield name= employee。姓氏值= % {员工。姓氏}“label=”% { getText( label。姓氏)} size= 40 /
s:textfield name= employee。“年龄”值=“% {雇员。age }“label=”% { getText( label。age )} size= 20 /
s:select name= employee。部门。departmentId value= % { employee。部门。 departmentId } list= departments list key= departmentId list value= name /
%-s:select name= gender list= % { # { Male :男性,女性:女性 }}/- %
s:隐名=员工。employeeid value= % { employee。employeeid } /
s:submit value= % { getText(按钮。标签。提交)} /
s:submit value= % { getText(按钮。标签。cancel )} name= redirect-action:index /
/s:表单
/body
/html
% @页内容类型= text/html;charset=UTF-8 语言=java%
% @ taglibprefix= s uri=/struts-tags %
超文本标记语言
头
link href= CSS/main。CSS rel=样式表 type= text/CSS /
标题s:文本名称=标签。员工//职位
/头
身体
应用程序。标题//div
h1 s:text name= label。员工//h1
s:urlid=urlaction=crud!输入/
a ref= s:property value= # URL /添加新员工/a
br/br/
桌子
tr
文本名称=标签。名字//th
文本名称=标签。姓氏//th
th s:textname=label.age//th
文本名称=标签。部门//th
th nbsp ./th
/tr
学生:迭代器值=雇员状态=状态
tr #状态。even even/s:if s:else odd/s:else
td s:propertyvalue=名字//td
TD s:属性值=姓氏/TD
td s:propertyvalue=age//td
TD s:属性值=部门。名称//TD
任务描述
s:urlaction=crud!输入" id="URL
s:param name= employee。 employeeId 值= employeeId /
/s:url
a ref= s:property value= # URL /Edit/a
图尔克
s:urlaction=crud!删除" id="URL
s:param name= employee。 employeeId 值= employeeId /
/s:url
a ref= s:属性值= # URL /删除/a
/td
/tr
/s:迭代器
/表格
/body
/html
% @页内容类型= text/html;charset=UTF-8 语言=java%
% @ taglibprefix= s uri=/struts-tags %
超文本标记语言
头
标题错误页面/标题
link href= s:URL value=/CSS/main。CSS / rel=样式表 type= text/CSS /
/头
身体
s:actionerror/
br/
为了解决此错误,请报告导致此错误的内容。
br/br/
以下信息有助于发展
team find where theerrorhappenedandwhatabledonetoprevent from
发生在未来。
/body
/html
背景色:白色;
字体系列:Verdana、Arial、sans-serif;
字体大小:12px
}。titleDiv{
背景色:# EFFBEF
字体粗细:粗体;
字体大小:18px
文本对齐:左对齐;
左填充:10px
填充顶部:10px
填充-底部:10px
边框:2px纯色# 8f 99 ef
}
h1 { font-weight:bold;颜色:棕色;字号:15px文本对齐:左对齐;}
TD { font-size:12px;右填充:10px}
th { text-align:left;字体粗细:粗体;字体大小:13px右填充:10px}。TD label { font-weight:bold;空白:nowrap垂直对齐:顶部;}
a { color:# 4a 825 a;文字-装饰:无;}
答:链接{文本装饰:无;}
答:参观过{文本装饰:无;}
答:悬停{text-decoration:无;颜色:红色;}。边框线{
边框:2px纯色# 8f 99 ef
}。但是{
字体系列:arial,无衬线;
字体大小:11px
105像素
背景色:# DCDFFA颜色:# 4A825A字体粗细:粗体;
}。错误{
颜色:红色;
字体粗细:粗体;
}。错误部分{
左填充:18px
填充-顶部:2px
填充-底部:10px
填充-右:5px
}。偶数{背景色:# eff bef}。奇数{背景色:白色;}。空白:nowrap}
到这里,这个例子基本上就完成了,其主要亮点在行为层的实现类和验证xml,而jsp页面的标签和struts.xml也比较耐看,将web.xml配置好支柱2的监听以后,部署到雄猫之后,浏览器键入:localhost:8080/CusManager,即可得到以上效果图所示。
我把所有代码都贴上了,包括css,任何地方都不会有缺陷。如果运行错误,请仔细检查错误,检查自己对web.xml的配置,除此之外,不会有任何错误。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。