struts2的使用,struts2框架

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: