当前位置:文档之家› 基于STRUTS框架的客户关系管理系统开发

基于STRUTS框架的客户关系管理系统开发

基于STRUTS框架的客户关系管理系统开发
基于STRUTS框架的客户关系管理系统开发

摘要

图书管理是高校内每一个系部或院部都必须切实面对的工作,但一直以来人们使用传统的人工方式管理图书资料。这种方式存在着许多缺点,如效率低、保密性差且较为繁琐。另外,随着图书资料数量的增加,其工作量也将大大增加,这必将增加图书资料管理者的工作量和劳动强度,这将给图书资料信息的查找、更新和维护都带来了很多困难。

图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。

关键词:图书;UML;Struts

目录

第1章绪论 (1)

1.1系统开发背景 (1)

1.2系统研究目的与意义 (1)

1.3可行性分析 (1)

第2章系统分析与设计 (2)

2.1系统分析 (2)

2.1.1用例图 (2)

2.1.2包图 (2)

2.1.3类图 (2)

2.2系统设计 (2)

2.2.1时序图 (2)

2.2.2活动图 (2)

2.3数据库建模 (2)

2.3.1概念模型 (3)

2.3.2物理模型 (3)

第3章系统实现 (3)

3.1开发环境搭建 (3)

3.1.1需要安装的技术平台 (3)

3.1.2开发工具的选择 (6)

3.2环境配置 (7)

3.2.1Struts框架配置 (7)

3.2.2服务器端配置 (9)

3.2.3第3方组件配置 (9)

3.3页面设计及功能实现 (10)

3.3.1登录界面 (10)

3.3.2主界面 (10)

3.3.3添加客户信息页面 (14)

3.3.4查看客户信息页面 (15)

3.3.5决策支持图表显示 (18)

3.3.6数据库连接实现 (18)

第4章软件测试 (20)

4.1单元测试 (20)

5.2集成测试 (21)

第5章工作总结和展望 (23)

参考文献 (24)

第1章绪论

1.1系统开发背景

目前各高校的图书管理系统仍然是只有管理管理的形式。一切信息只能从管理员那里得到,这种系统带来了很多不方便,同时也增加了工作人员的负担。因为要对图书的借入、归还的记载,还有新书的引进和归类等进行处理,导致工作的繁重和堆积,如果只凭借人力去处理和解决,往往要付出大量的工作时间,然而得到的效率却很低。为了更好的解决和处理问题,减少工作时间,减轻管理人员的负担,建立一个更完善的管理体系,创建一个图书管理系统事在必行,以保证能够适应现今社会并提高工作效率。

现在通过面向对象的技术可以解决多端口访问的问题,学生也可以在别的地方访问该系统以得到自己所需要的信息。数据库技术SQL Server2000的应用比access技术更先进。这些都能增加系统的优越性和可行性。

1.2系统研究目的

由于对图书管理工作需求的考虑,解决管理工作中所遇到的问题,方便管理者随时可以进行操作,减轻工作人员目前繁重复杂的工作,使管理工作变得醒目、简捷、有条理,开发本系统是十分必要而且重要的。。

1.3可行性分析

技术可行性:Struts框架作为基于MVC设计模式的Web应用的一种典型体现,Struts架构对Model、View和Controller提供了现成的实现组件。在Controller 控制器部分中,Struts中的Controller控制器部分的作用是接收用户端浏览器的请求,然后选择执行相应的图书逻辑,再把响应结果送到用户端;在Model模型部分中,Struts架构使用JavaBean来提供具体的图书逻辑,这种图书逻辑的细分可以增强代码的可重用性;在View视图部分,Struts依然可以使用JSP来实现,同时,Struts还提供了丰富的自定义标记库,View部分使用这些自定义标记同样可以实现与Model部分的有效交互并能够增强显示功能。随着Web技术日益成熟,Struts逐渐作为Web开发中比较成熟的一种框架被使用。

应用可行性:本系统是对传统CRM开发方式的变革,通过使用B/S的部署方式,用户通过浏览器就可以直接访问系统,操作方式贴近用户上网习惯,方便用户“随时随地”使用地同时,也极大地提高了工作效率,进而降低学校成本。

第2章系统分析与设计

本系统使用UML统一建模语言设计系统模型,静态模型使用用例图、类图、包图表示,动态模型使用活动图、状态图表示。

2.1系统分析

2.1.1用例图

用例图的目的是使用简单直观的方式,描述软件系统的功能和需求。在用例图中一般包括行为者和用例两个方面的描述。其中用例用来说明用户的具体需求,而行为者则是用来描述要和用例之间进行交互的软件系统外部的人或者系统。

2.1.2包图

一个"包图"可以是任何一种的UML图组成,通常是UML用例图或UML类图。包是一个UML结构,它使得你能够把诸如用例或类之类模型元件组织为组。包被描述成文件夹,可以应用在任何一种UML图上。

2.1.3类图

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性信息。

2.2系统设计

2.2.1时序图

2.2.2活动图

活动图用于显示动作及其结果。其重点在于描述方法实现中所完成的工作,以及用例实例或者对象中的活动。

2.3数据库建模

本系统的数据库建模使用的工具是PowerDesigner,它提供了拖放方式的可视化映射工具,通过使用它,用户可以方便、快速及准确地记录数据依赖关系。

2.3.1概念模型

概念模型是对真实世界中问题域内的事物的描述,不是对软件设计的描述。概念模型包括:实例、关联、属性。本系统概念模型如下图所示:

2.3.2物理模型

物理模型对应着数据库中的表,如图2-25是该系统物理模型图。

第3章系统实现

3.1开发环境搭建

3.1.1需要安装的技术平台

在搭建开发环境之前,需要提前安装相关的软件以及提供Web应用的基本技术平台,包括JDK、Web Container以及DataBaseServer的安装。

1.Java2SDK SE

Struts应用中的核心代码是用Java语言编写的,因此其应用的运行需要

JDK(Java Development Kits)的支持。本开发使用JDK1.5版本。如图所示:

图3-1JDK安装

2.Servlet Container(Web Application Server)

Struts可以运行在任何一个支持JSP1.2以上版本和Servlet2.3以上版本的Web Container中,目前支持JSP的应用服务器是比较多的,如Tomcat、Resin、Websphere、Weblogic等。

Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。

本开发使用Apache Tomcat5.5版本,它的运行主界面如图4-2所示:

图3-2Tomcat运行界面

3.DataBaseServer

MySQL是一个免费的,快速稳定并且支持多线程多用户的数据库服务器,可以与Java、C、C++、PHP等语言进行连接,可以运行在Windows、Linux、FreeBSD、OS/2等平台上。

本系统使用的数据库服务器是MySql5.0版本,运行界面如图:

图3-3MySql运行图

3.1.2开发工具的选择

Eclipse是一种可扩展的开放源代码IDE。它允许在同一IDE中集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显著改变了项目工作流程,使开发者可以专注在实际的嵌入式目标上。

Eclipse出色而具独创性的平台特性及开放源代码的特点,吸引了IBM、Borland、Oracle、Sybase和RedHat等知名IT厂商加入到Eclipse平台的扩展上来。开源软件的蓬勃发展,更是强化了Eclipse作为开发工具方面的优势,如Spring、Struts等开源框架都会附带提供各自的Eclipse插件工具。

本系统使用J2EE开源框Struts在Windows平台下进行开发,因此选择基于Eclipse的MyEclipse6.0作为开发工具,MyEclipse支持多种平台并且集成了大量的J2EE插件,能够方便快捷地将各个框架集成起来,节省了大量配置框架的时间,大大提高了开发效率。

运行界面如图所示:

图3-4MyEclipse运行界面

3.2环境配置

搭建好开发环境后,需要对系统的运行环境进行一下相关配置,主要包括Struts 框架配置,服务器端配置以及相关的第3方组件配置。

3.2.1Struts框架配置

详细内容可以在struts-config.xml文件中找到。

1.ActionForm配置

type="https://www.doczj.com/doc/b81361293.html,erActionForm"/>

type="crm.wj.actionform.DictionaryActionForm"/>

type="crm.wj.actionform.CustomerActionForm"/>

type="crm.wj.actionform.LinkmanActionForm"/>

type="crm.wj.actionform.BargainActionForm"/>

type="crm.wj.actionform.MoneyBackActionForm"/>

type="crm.wj.actionform.BidActionForm"/>

type="crm.wj.actionform.ProduceActionForm"/>

type="crm.wj.actionform.QuotePriceActionForm"/>

type="crm.wj.actionform.HistoryActionForm"/>

type="https://www.doczj.com/doc/b81361293.html,petitorActionForm"/>

type="crm.wj.actionform.ArrangeActionForm"/>

2.Action配置

name="loginForm">

name="testForm"scope="request">

name="linkmanForm"scope="request">

………….

name="careForm"scope="request">

name="competitorForm"scope="request">

name="arrangeForm"scope="request">

3.其他配置

3.2.2服务器端配置

详细内容可以在web.xml文件中找到

index.jsp

action

org.apache.struts.action.ActionServlet

config

/WEB-INF/struts-config.xml

debug

2

detail

2

2

action

*.do

3.2.3第3方组件配置

详细内容可以在web.xml文件中找到。

DisplayChart

org.jfree.chart.servlet.DisplayChart

DisplayChart

/servlet/DisplayChart

3.3页面设计及功能实现

3.3.1登录界面

图4-5登录界面效果图

3.3.2主界面

图4-6主界面效果图

主界面设计主要使用了CSS和JAV ASCIPT技术,CSS主要用来控制界面风格及页面元素的样式,JAV ASCIPT用来实现系统菜单的动态收缩和扩展。

CSS样式表代码如下:

/*滚动条样式*/

body{

SCROLLBAR-FACE-COLOR:#EFEFEF;

SCROLLBAR-HIGHLIGHT-COLOR:#E1411D;

SCROLLBAR-SHADOW-COLOR:#E1411D;

SCROLLBAR-3DLIGHT-COLOR:#ffffff;

SCROLLBAR-ARROW-COLOR:#E1411D;

SCROLLBAR-TRACK-COLOR:#ffffff;

SCROLLBAR-DARKSHADOW-COLOR:#ffffff;

}

/*任何一个按钮样式*/

.button{

background-image:url(images/button_bg.gif);

background-color:#FFFFFF;

border-top:1px solid#C8CCCB;

border-left:1px solid#C8CCCB;

border-bottom:1px solid#C8CCCB;

border-right:1px solid#C8CCCB;

background-repeat:repeat-x;

padding-top:4px;

padding-bottom:0px;

padding-left:0px;

padding-right:0px;

margin-right:0px;

text-decoration:line;

font-size:12px;

color:#000002;

}

input{border-style:expression((this.type=="text"||this.type=="password")?"solid":"")} input{border-width:expression((this.type=="text"||this.type=="password")?"1px":"")} TEXTAREA{color:000000;border:1px solid#DADADA;background-color:#ffffff;} SELECT{FONT-SIZE:9pt;FONT-FAMILY:宋体}

.Navigation font{

PADDING-RIGHT:1px;

PADDING-LEFT:1px;

FILTER:glow(color=#FFFFFF,strength=3);

PADDING-BOTTOM:1px;COLOR:#000000;

PADDING-TOP:1px;

HEIGHT:10px

}

.Navigationtdbg{background:#F5F9FE;padding:03px;height:22;}

/*子页表格样式*/

.title2{

background-color:#F4A494;

height:22px;

font-size:12px;

COLOR:#ffffff;

border-bottom:1px solid#dadada;

text-align:left;

letter-spacing:2px;

}

/*managemain.html中样式*/

/*最上面的图片样式*/

.TOPBg{

background:url("Images/TOPBg.gif");

HEIGHT:75px;}

/*菜单样式*/

.ManageMainMenu{

background:url("Images/TopMenuBg.gif");

height:25px;

font-size:12px;

color:#FFFFFF;}

/*右上菜单上字体样式*/

.WSOASTopMenuFont{

font-size:12px;

color:#FFFFFF;

}

/*菜单链接样式*/

.ManageMainMenuHref{

font:normal12px宋体;

color:#FFFFFF;

text-decoration:none;

}

.ManageMainMenuHref a:link{

font:normal12px宋体;

color:#FFFFFF;

text-decoration:none;

}

.ManageMainMenuHref a:visited{

font:normal12px宋体;

color:#FFFFFF;

text-decoration:none;

}

.ManageMainMenuHref a:active{

font:normal12px宋体;

color:#FFFFFF;

text-decoration:none;

}

.ManageMainMenuHref a:hover{

font:normal12px宋体;

color:#FFFF00;

text-decoration:none;

}

/*背景色*/

.ManageMainBgcolor{

background-color:#F5B3A3;

}

.managemainbottom{

font-size:14px;

color:#FFFF33;

}

实现菜单的收缩和扩展JavaScipt代码如下:

//展开、收缩菜单

function showsubmenu(sid)

{

var whichEl=document.getElementById("submenu"+sid);

var imageId=document.getElementById("imgMenu"+sid);

var MenuICOId=document.getElementById("MenuICO"+sid);

var strShow=true;

if(whichEl.style.display=="none")

{

whichEl.style.display="";

imageId.src="images/gif/MenuICO/Menu_close.gif";

MenuICOId.src="images/gif/MenuICO/openfolder.gif";

for(i=0;i

{

srcelement=document.all(i);

if(srcelement.className=="MenuPIC"){

var targetid=srcelement.id;

var targetelement=document.all(targetid);

var strbuf=srcelement.src;

if(strbuf.indexOf("Menu_close.gif"))

strShow=false;

}

}

}

else

{

whichEl.style.display="none";

imageId.src="images/gif/MenuICO/Menu_open.gif";

MenuICOId.src="images/gif/MenuICO/Menufolder.gif";

for(i=0;i

{

srcelement=document.all(i);

if(srcelement.className=="MenuPIC"){

var targetid=srcelement.id;

var targetelement=document.all(targetid);

var strbuf=srcelement.src;

if(strbuf.indexOf("Menu_open.gif"))

strShow=true;

}

}

}

//全部展开/收缩菜单

function AllShowsubmenu()

{

var AllShowTitle=document.getElementById("AllShowTitle");

for(i=0;i

{

srcelement=document.all(i);

if(srcelement.className=="MenuPIC")

{

var targetid=srcelement.id;

var targetelement=document.all(targetid);

var strbuf=srcelement.src;

var strbufId=targetid.replace("imgMenu","");

var whichEl=document.getElementById("submenu"+strbufId);

var MenuICOId=document.getElementById("MenuICO"+strbufId);

if(AllShowTitle.innerHTML=="全部收缩"){

srcelement.src="images/gif/MenuICO/Menu_open.gif";

MenuICOId.src="images/gif/MenuICO/Menufolder.gif";

whichEl.style.display="none";

}else{

srcelement.src="images/gif/MenuICO/Menu_close.gif";

MenuICOId.src="images/gif/MenuICO/openfolder.gif";

whichEl.style.display="";

}

}

}

if(AllShowTitle.innerHTML=="全部展开")

AllShowTitle.innerHTML="全部收缩";

else

AllShowTitle.innerHTML="全部展开";

}

3.3.3添加客户信息页面

该页面可以对客户信息进行添加,因为涉及到数据内容较多,考虑到系统运行效率,将数据验证工作交给了JavaScript控件,这里以时间输入来进行说明。

该功能使用的是一个JavaScript时间控件,通过该控件可以方便控制时间格式,时间输入形式,如果所示,在“最近联系”中,用户将只能选择今天(包括今天)以前的日期,该方法实现方法可以见源代码。

添加客户信息模块

//从客户表单中得到数据

CustomerActionForm caf=(CustomerActionForm)form;

/**

*@author WJ

*验证客户是否存在

*/

if(CustomerDao.isRepeatForCustomer(caf.getName())==true){

request.setAttribute("msg","失败!该客户已存在");

return mapping.findForward("msg");

}

caf.setAddress1(Address1Dao.getAddressByNumber(caf.getAddress1()))

……………………

/**

*使用BeanUtils类的copyProperties方法可以方便地将

*表单内容存到对象中

*/

CustomerDao customerDao=new CustomerDao();

BeanUtils.copyProperties(customerDao,caf);

/**

*生成客户编号格式crmrjcn+时间

*/

SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");

String currentTime="crmrjcn"+sdf.format(new java.util.Date());

System.out.println(currentTime);

customerDao.setNumber(currentTime);

……………………

//返回到指定提示页

return mapping.findForward("msg");

3.3.4查看客户信息页面

刚进入页面时,程序默认是分页显示全部数据,用户可以输入或者选择查询条件进行查询,同时在查看同时,登录用户权限可以进行修改、删除等操作。

为了数据显示方便,使用了分页查询显示,具体实现代码:

/**

*从客户端得到是全部显示数据还是查询显示

*/

String style=request.getParameter("style");

String strPageNo=request.getParameter("pageNo");

//全部显示数据

if(style.equals("selectall")){

PageClass pc=new PageClass();

int pageNo=pc.getPageNo(strPageNo);

//得到总记录数

String sql1="select*from customer";

ListlistTemp=CustomerDao.getCustomer(sql1);

int allRecord=listTemp.size();

//得到总页数

int totalPage=pc.getTotalPageOne(allRecord);

//这里是使用了mysql中自己带的limit分页语法

int startPos=(pageNo-1)*FinalClass.PAGESIZEONE;

String sql="select*from customer limit"+startPos+","

+FinalClass.PAGESIZEONE;

Listlist=CustomerDao.getCustomer(sql);

//得到当前页记录

int pageNumber=list.size();

//得到上一页

int lastPageNo=pageNo-1;

//得到下一页

int nextPageNo=pc.getNextPageNo(pageNo,totalPage);

//返回给客户端浏览器

request.setAttribute("customerlist",list);

……………….

request.setAttribute("style","selectall");

}else if(style.equals("selectlike")){

CustomerActionForm caf=(CustomerActionForm)form;

……………….

/**

*从客户端拿到查询条件,通过代码设置保证初始值存在

*/

String kw1=null;

if(kw1Str!=null){

………..

}else{

kw1=kw1ActionForm;

}

String ty1=null;

if(ty1Str!=null){

try{

ty1Str=new String(request.getParameter("ty1").getBytes(

"iso8859-1"),"gb2312");

//这里赋值是必须的

ty1=ty1Str;

}catch(UnsupportedEncodingException e1){

e1.printStackTrace();

}

}else{

ty1=ty1ActionForm;

}

…………………..

/**

*对分页时,需要的变量进行初始化

*/

PageClass pc=new PageClass();

…………..

int allRecord=0;

int totalPage=0;

int startPos=0;

int pageNo=pc.getPageNo(strPageNo);

/**

*开始查询条件判断,同时返回包括所有对应记录的listTemp对象*/

if(ty1.equals("0")||ty1==null){

………..

}

}else{

……….

}

//数据记录数

allRecord=listTemp.size();

//总页数

totalPage=pc.getTotalPageOne(allRecord);

/**

*根据页的当前位置取出对应的记录

*/

startPos=(pageNo-1)*FinalClass.PAGESIZEONE;

int length=startPos+FinalClass.PAGESIZEONE;

if(length>listTemp.size()){

length=listTemp.size();

}

for(int i=startPos;i

…….

}

…………………..

request.setAttribute("style","selectlike");

}

//返回到指定页面

return mapping.findForward("customerlist");

修改代码如下:

//从客户端表单收集数据

………………………..

String url=null;

//判断操作入口

if(childType==null){

request.setAttribute("customerDao",customerDaoTemp);

request.setAttribute("userMan",list2);

url="customermodify";

}else if(childType.equals("modify")){

//执行更新操作

System.out.println(customerDao.getRemark()+"---CustomerAction.java--test");

customerDao.updateCustomerForModify();

request.setAttribute("msg","success");

url="msg";

}

//根据操作结果进行跳转

return mapping.findForward(url);

删除代码:

//得到要删除对应记录的id

String idStr=request.getParameter("id");

int id=Integer.parseInt(idStr);

//根据id删除该对象

CustomerDao.delCustomerById(id);

request.setAttribute("msg","删除成功");

return mapping.findForward("msg");

3.3.5决策支持图表显示

本系统除可以进行客户等有关信息的维护外,还可以将客户有关信息以报表等形式展示给客户,为用户的日常工作提供必要支持。

图3-11费用分析图表效果

饼图的效果使用的是Jfreechart报表,具体代码如下:

public class BingTu{

HttpSession session=null;

public BingTu(HttpSession s){

session=s;

}

public String getFileName(int score[],String department){

JFreeChart chart=createChart(createDataset(score),department);

String filename=null;

try{

filename=ServletUtilities.saveChartAsPNG(chart,500,300,null,session);

}catch(IOException e){

e.printStackTrace();

}

return filename;

}

//生成饼图数据集对象

public PieDataset createDataset(int score[]){

DefaultPieDataset defaultpiedataset=new DefaultPieDataset();

return defaultpiedataset;

}

//生成图表主对象JFreeChart

public JFreeChart createChart(PieDataset piedataset,String department){

//定义图表对象

JFreeChart jfreechart=ChartFactory.createPieChart(department

+"一季度费用分析图",piedataset,true,true,false);

//获得图表显示对象

PiePlot pieplot=(PiePlot)jfreechart.getPlot();

//设置图表标签字体

pieplot.setLabelFont(new Font("SansSerif",Font.BOLD,12));

pieplot.setNoDataMessage("No data available");

pieplot.setCircular(true);

pieplot.setLabelGap(0.01D);//间距

return jfreechart;

}

}

3.3.6数据库连接实现

本系统使用JDBC的数据库连接技术,系统与数据库实现连接代码如下:

Struts2框架工作原理及应用体会

2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·

struts2验证框架

Struts2Validator Struts2验证框架 Updated Jun 18, 2010 by cm2...@https://www.doczj.com/doc/b81361293.html, Action配置中一定要设置input返回页面 添加验证只要创建验证的xml文件 1.创建xml文件名 验证Action中全部方法 在Action同包下,创建:Action类名-validation.xml 如:ValidateAction创建ValidateAction-validation.xml 验证Action中单个方法 注意事项 注意: 1.要验证的方法不能叫input. 2.这样配置在form表单中要在中action写好名称, 不能写action="validate_",然后 这样会找不到对应的配置文件,跳过验证. 3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口, 然后prepare()方法里初始化添加页面需要的值. 4.如果使用Preparable接口,必须在action配置中添加

java-struts2复习题

Struts2复习题 1.以下属于struts2的控制器组件是: A.Action B.ActionForm C.ActionServlet D.dispatchAction 2.以下属于struts2的体系结构的是:(多选) A.struts2控制器组件 B.struts2配置文件 C.FilterDispathcer D.Action 3.以下属于struts2配置文件中的配置元素是:(多选) A. B. C. D. 4.关于struts1和struts2对比的说法正确的是: A.struts1要求Action类继承struts1框架中的Action父类,struts2中则不一定需要继承,可以是POJO类 B.struts1中的Action不是线程安全的,而struts2中的Action是线程安全的 C.struts1和struts2中都使用ActionForm对象封装用户的请求数据 D.struts1使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值 5.以下关于ValueStack说法正确的是:(多选) A.每个Action对象实例拥有一个ValueStack对象 B.每个Action对象实例拥有多个ValueStack对象 C.Action中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中 D.ValueStack会在请求开始时被创建,请求结束时消亡 6.关于struts2配置文件说法正确的是: A.必须在WEB-INF/classes目录下 B.名字必须为struts.xml C.配置Action时,必须配置包信息 D.使用元素配置转发 7.在struts2配置中用()元素来配置常量: A. B. C. D. 8.关于struts2包的说法正确的是: A.struts2框架使用包来管理常量 B.struts2框架定义包时必须指定name属性 C.struts2框架中配置包时,必须继承自struts-default包,否则会报错 D.struts2框架中使用包来管理Action 9.struts2中获取Servlet API的方法正确的是:(多选) A.使用ActionContext对象以解耦合的方法访问Servlet API B.使用ServletActionContext对象以解耦合的方式访问Servlet API C.使用ActionContext对象以耦合的方式访问Servlet API D.使用ServletActionContext对象以耦合的方式访问Servlet API 10.struts2动态调用的格式为: A.ActionName?methodName.action B.ActionName! methodName.action C.ActionName*methodName.action D.ActionName@mathodName.action 11.如果要实现struts2的数据校验功能 A.普通Action类可以实现

struts2 实验报告

1.系统分析与设计 1.1 系统功能描述 本系统是个非常简单的注册、登录系统。本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。 当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。 当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。 系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。 系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。 当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。 除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。 1.2 系统功能流程

1.3 数据库设计 相关的映射文件: 一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。 2.系统实现与测试 2.1 系统采用的关键技术 MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。Struts2框架的稳定性,为系统的稳定运行提供了保证。

structs2知识点

Struts2原理 上图来源于Struts2官方站点,是Struts 2 的整体结构。 Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 (1)核心控制器:FilterDispatcher

FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter 会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。 Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。 Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action 时,定义了该Action的name属性和class属性,其中name属性决定了该Action 处理哪个用户请求,而class属性决定了该Action的实现类。 Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。 (2)一个请求在Struts2框架中的处理大概分为以下几个步骤 1 .客户端初始化一个指向Servlet容器(例如Tomcat)的请求,即HttpServletRequest请求。 2 .这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3. 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 .如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 .ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 .ActionProxy创建一个ActionInvocation的实例。 7 .ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 .一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

Struts2的工作机制原理分析及实例

Struts2的工作机制分析及实例 一、概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x 与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.doczj.com/doc/b81361293.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。 (图14) 二、主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。

Struts2知识点总结

Struts2基础知识 Struts2概述 1.Struts2框架应用javaee三层结构中的web层框架。 2.Struts2框架在struts1和webwork基础之上发展的全新框架。 3.Struts2所解决的问题: 在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。 图解: 4.现在比较稳定的Struts2版本 struts-2.3.24-all.zip 5.web层常见框架 1.struts 2.springMVC Struts2框架入门 1.导入jar包 1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring 包,是不能使用的,导入会导致程序不能运行。 2.到app目录里面复制案例的jar包是最好的方法。 2.创建action 3.配置action类的访问路径

1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的, 位置必须在src下面,名称为struts.xml 。 2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即 可。 3.action的配置 *注意访问路径: http://域名/端口号/项目名/action名.action 注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。 4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴 即可。 Struts2执行过程 图解:

Struts2配置

1.是一种常量标签 2.修改Struts2的默认常量值 1.常用方式 在struts.xml中进行配置。 2.其它两种方式 1.在src下面创建struts.properties文件并修改。 2.在web.xml文件中进行修改。 3.Struts2最常用的常量 struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。

基于Struts2框架的信息发布系统的设计与初步实现

第一章Struts2的起源和发展 说到网络应用很难让人不联想到网络信息的浏览,自从Internet进入民用领域之后,上网成为了越来越多的人闲暇时光的消磨手法。于是网络系统的开发也变得越来越总要。 1.1 Web技术的发展 随着Internet技术的大面积应用和发展,传统的静态HTML页面由于缺乏足够的用户交互能力已经无法满足日益膨胀的网络需求。人们希望Web应用中能够包含更多的动态交互功能,于是为了应对拥有更广泛用户群的动态Web开发,软件开发商分别推出的ASP和JSP两款动态网站开发解决方案。但是当时的JSP 开发并没有很科学的层次设计,最初的JSP开发中逻辑代码和前端代码杂合在一起。虽然在最初开发时这样的做法使得开发非常的容易,然而随着Web系统的使用越来越广泛,应用规模的日益增长,如果继续使用传统的简单的JSP + Servlet 结构进行Web系统的开发,则会由于系统层次混乱而导致系统的开发难度和维护成本越来越大,最终使开发过程陷入困境。 1.2 MVC思想进入Web系统开发 面对开发过程中所出现的困难,开发者们试图寻找一种能够使得开发结构更加具有条理性的开发模式。根据以往面向对象系统设计的经验,开发者开始将MVC开发模式引入Web系统的开发。MVC模式将一个应用分为三个基本部分:Model(模型)、View(视图)、Controller(控制器)。在此模式中触发事件由控制器捕获,并根据事件的类型来改变模型和视图。这样既可将系统模型与视图分离,从而使各部分能够工作在最小的耦合状态下协同工作,从来提高系统的扩展性和可维护性。将其引入Web系统开发后,系统模式由传统的JSP完成用户请求和响应改变为由控制器捕获用户请求,JavaBean完成模型操作,而JSP专门负责响应用户需求。老一代的开发框架Struts1便是这时的产物。

struts2和springMVC的比较(超详细)

把这张图放在这里,我是想说SpringMVC和Struts2真的是不一样的,虽然在都有着核心分发器等相同的功能组件(这些由MVC模式本身决定的)。 为什么SpringMVC会赢得最后的胜利呢?谈几点我自己的看法: 第一、MVC框架的出现是为了将URL从HTTP的世界中映射到JAVA世界中,这是MVC 框架的核心功能。而在URL这一点SpringMVC无疑更加优雅。 第二、从设计实现角度来说,我觉得SpringMVC更加清晰。即使我们去对比Struts2的原理图和SpringMVC的类图,它依然很让人困惑,远没有SpringMVC更加直观:

SpringMVC设计思路:将整个处理流程规范化,并把每一个处理步骤分派到不同的组件中进行处理。 这个方案实际上涉及到两个方面: l 处理流程规范化——将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来 l 处理流程组件化——将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式 处理流程规范化是目的,对于处理过程的步骤划分和流程定义则是手段。因而处理流程规范化的首要内容就是考虑一个通用的Servlet响应程序大致应该包含的逻辑步骤: l 步骤1——对Http请求进行初步处理,查找与之对应的Controller处理类(方法)——HandlerMapping l 步骤2——调用相应的Controller处理类(方法)完成业务逻 辑——HandlerAdapter l 步骤3——对Controller处理类(方法)调用时可能发生的异常进行处理——HandlerExceptionResolver

struts2框架

Struts2 1.Struts2介绍 Struts2是Apache发行的MVC开源框架。Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的。在MVC流程框架中充当控制器角色。 M:model-----数据封装------->javabean(Hibernate、MyBatis) V:view------视图----------->jsp(JSTL+EL) C:control------控制器--------> struts2( filter) 2.开发第一个Hello word 2.1导包 1)struts2-core-2.x.x.jar :Struts 2框架的核心类库 2)xwork-2.x.x.jar :XWork类库,Struts 2在其上构建 3)ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),Struts 2框架使 用的一种表达式语言 4)freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写 5)commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持 Log4J和JDK 1.4+的日志记录。 6)Commons-fileupload 拷进去

2.2 配置struts 的核心过滤器 2.3 struts.xml文件

2.4 编写Action 2.5 编写JSP页面

3.在Struts.xml配置Action 3.1 默认值 3.2 result跳转类型

struts框架介绍

这章适合做参考,如果你那里不清楚,可上这里查技术资料 二.Struts框架 struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。 本章详细讨论struts架构。我们将看到struts是如何清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序过程的。我们还将介绍struts提供的类如何使得开发工作更加简单,这些类包括: ●控制程序流程的类 ●实现和执行程序事务逻辑的类 ●自定义的标记库使得创建和验证HTML表单更加容易 1.Struts压缩包内容 文件夹jakarta-struts-1.0.2包含两个目录,lib和webapps。在lib目录中有使用struts创建 在webapps目录下有如下文件: 让我们从MVC角度观察struts框架中的组件

框架中三个部分:模型,视窗和控制器。 模型 在struts框架中,模型分为两个部分: ●系统的内部状态 ●可以改变状态的操作(事务逻辑) 内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。 大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean 调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。 视窗 由JSP建立,struts包含扩展的自定义标签库,可以简化创建完全国际化用户界面的过程。控制器 struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。 2.Struts框架中的组件 (由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMapping,JSP和Tag Library包含进来,有时间作完替换)

Struts2+Hibernate架构技术教程课后参考答案

第1章Struts2框架技术入门 1.5 习题 1.5.1 选择题 1.D 2.A 3.C 4.B 5.B 1.5.2 填空题 1.MVC 2.Struts1和WebWork 3.IBM 4. FilterDispatcher 5.JSP、Struts2标签 1.5.3 简答题 1.简述MVC设计模式的工作流程。 答:MVC设计模式工作流程是: (1)用户的请求(V)提交给控制器(C); (2)控制器接受到用户请求后根据用户的具体需求,调用相应的JavaBean或者EJB(M部分)来进行处理用户的请求; (3)控制器调用M处理完数据后,根据处理结果进行下一步的调转,如跳转到另外一个页面或者其他Servlet。 2.简述Struts2的工作原理。 答:Struts2中使用拦截器来处理用户请求,从而允许用户的业务控制器Action与Servlet分离。用户请求提交后经过多个拦截器拦截后交给核心控制器FilterDispatcher处理,核心控制器读取配置文件struts.xml,根据配置文件的信息指定某一个业务控制器Action(POJO类)来处理用户数据,业务控制器调用某个业务组件进行处理,在处理的过程中可以调用其他模型组件共同完成数据的处理。Action处理完后会返回给核心控制器FilterDispatcher一个处理结果,核心控制器根据返回的处理结果读取配置文件struts.xml,根据配置文件中的配置,决定下一步跳转到哪一个页面。 一个客户请求在Struts2框架中处理的过程大概有以下几个步骤: (1)客户提交请求到服务器; (2)请求被提交到一系列的过滤器过滤后最后到FilterDispatcher; FilterDispatcher是核心控制器,是基于Struts2中MVC模式的控制器部分; (3)FilterDispatcher读取配置文件struts.xml,根据配置信息调用某个Action来处理客户请求; (4)Action执行完毕,返回执行结果,根据struts.xml的配置找到对应的返回结果。

Struts2框架优缺点

本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用 框架时,所产生的种种安全问题,以及作者挖掘框架安全漏洞的一些心得体会。推荐以下人群阅读 了解java开发 了解框架开发 了解web application安全 “网络安全爱好者” 正文 当前java开发网站,通常不会是纯JSP的,大都使用了java framework。 有了这些framework,让开发人员更加快速的开发出代码,也让代码非常具有可扩展性,那些分层架构的思想, 更是深入人心。这些也大大影响了安全代码审核,曾提出“分层审核代码”的思想,比如在DAO层专门检查 sql注入,在view层检查xss等。这些框架都有自己的层级,本次文章主要讲的是struts这个框架的相关 安全问题,也会有小部分涉及到struts后面的DAO层。 而struts这个框架更新占有市场份额极大的一个框架,它在各个层级中,位于如图所示位置:

可以看到struts在web应用中,负责处理接收用户数据,调用业务处理,以及展示数据的工作。所以本文把 struts的功能分为controller层和view层,controller层来完成接收用户数据,分发用户请求,而view专门 用于展示数据。 一个单独的struts,是不合逻辑的,因为架构师通常喜欢多种框架集合,让它们各自负责某一层的处理。 研究一个框架的安全问题,不能仅仅站在框架的角度,还应该充分考虑到开发人员是如何使用这些框架的, 他们最喜欢写什么样的代码,这样才能还原一个正常的、完整的web应用场景。从搜索结果看,互联网中,绝大多数教程推荐struts+hibernate+spring这样的黄金组合,那么,我假设有 一个应用使用了这个组合,以struts为重点,站在攻击者的角度,层层分析struts的设计缺陷。 Struts2开发回顾与简单学习 为了让大家回顾或者学习一下struts2,我们一起来建立一个action、jsp页面,做一个接收用户输入,之后 处理一下,再展示出来给用户的过程,精通struts2的同学可以跳过此步。 -------------------------------------struts回顾start 首先建立action,叫做AaaaAction:

Struts2工作原理

struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说 struts2是struts1和Webwork结合的产物。 struts2 的工作原理图: 一个请求在Struts2框架中的处理分为以下几个步骤: 1.客户端发出一个指向servlet容器的请求(tomcat); 2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。 3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2 的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。 如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一 些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results, Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper 类来查找请求中 需要用到的Action。 4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象

。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action 类。 5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了 Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。 6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相 关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在 调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。 7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果 通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表 示的过程中可以使用Struts2 框架中继承的标签。

Struts2框架搭建教程

Struts2教程1:第一个Struts2程序 在本系列教程中我们将学习到Struts2的各种技术。在本教程中使用的工具和程序库的版本如下: 开发工具:MyEclipse6 Web服务器:Tomcat6 Struts版本:Struts2.0.11.1 JDK版本:JDK1.5.0_12 J2EE版本:Java EE5.0 在本系列教程中Web工程的上下文路径都是struts2,如果在Web根目录有一个index.jsp文件,则访问路径如下: http://localhost:8080/struts2/index.jsp 由于MyEclipse6目前并不支持Struts2,所以我们需要到https://www.doczj.com/doc/b81361293.html,去下载Struts2安装包。要想正常使用Struts2,至少需要如下五个包(可能会因为Struts2的版本不同,包名略有差异,但包名的前半部是一样的)。 struts2-core-2.0.11.1.jar xwork-2.0.4.jar commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar Struts2虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了Struts1.x的方式(当然,Struts2仍然是基于MVC模式的,也是动作驱动的,可能这是唯一没变的东西)。Struts2实际上是在Webwork基础上构建起来的MVC框架。我们从Struts2的源代码中可以看到,有很多都是直接使用的xwork(Webwork的核心技术)的包。既然从技术上来说Struts2是全新的框架,那么就让我们来学习一下这个新的框架的使用方法。

struts2源代码分析(个人觉得非常经典)

本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留S truts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在We bWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.doczj.com/doc/b81361293.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src"struts-2.0.10"src"core"src"main"java目录下查看Struts2的源文件,如图14所示。 (图14) 主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。 以下是对各包的简要说明: 包名说明

Struts2+Hibernate框架技术教程课后习题答案(张志峰主编)

1.5习题(第33页) 1.5.1选择题 D C C B B 1.5.2填空题 1.MVC 2.Struts Hibernate 3.IBM 4.FilterDispatcher 5. JSP Struts标签 2.7习题(第86页) 2.7.1选择题 B C B D B D 2.7.2填空题 1.struts.xml struts.properity 2.struts.xml struts.properity web.xml 3.Action 拦截器 4.完全分离 5.IOC和非ioc 6.不指定method 不指定method 7.表达式根对象上下文环境 8.UI标签非UI标签 9.表单标签非表单标签 10.控制标签数据标签 3.6习题(第133页) 3.6.1选择题 A A B C C 3.6.2填空题 1..properties 2.native2ascii 3.AOP 4.服务器端校验 5.5习题(第237页) 5.5.1选择题 A B A 5.5.2填空题 1. JDBC ORM

2. Hibernate.cfg.xml Hibernate.properities 3. Hibernate.hbm.xml 4. 临时状态持久状态脱管状态 7.6习题(第326页) 6.11.1选择题 B A C 6.11.2填空题 1.一对一一对多多对多 2.HQL Criteria query native sql 3.一级cache 二级cache Spring3 9.5习题 9.5.1选择题 B A C 9.5.2填空题 1.配置条件 2.bean factory接口及相关类 application contest接口及相关类 3.设置注入构造注入 10.7.1选择题 B D C 10.7.2填空题 1.静态AOP 动态AOP 2.通知 3.静态代理动态代理 4.前置通知后置通知

Struts2框架技术教学大纲

Struts框架技术课程教学大纲 软件工程和软件日强(Java方向) 课程名称:Struts框架技术 预备基础:Java,HTML,Web基础,SQL,UML,J2EE 课程简介: 本课程介绍了当今在Java Web开发中特别流行的MVC模式的Struts2的架构技术。阐述了Struts2如何简化和加快Web的开发速度,提高了Java Web系统的可扩充性,可维护性。讲述了Struts2框架的基本结构,各个组成部件的功能;Struts2框架的配置;Struts2国际化的信息资源,Struts2与Tiles2的融合。 课程管理: 大连理工大学城市学院计算机工程学院。 教学目标: ●熟悉Struts2架构的组成部分。 ●熟悉企业级应用的分层概念和MVC模式,JSPModel1和Model2模型。。 ●Struts2的Web项目的初始配置。 ●Struts2项目开发的基本流程。 ●Action的开发,部署,配置和与Model层的协作。 ●Action的结果和页面跳转的配置和编程。 ●熟练使用Struts2拦截器进行应用的扩展。 ●熟练使用Struts2的OGNL和类型转换。 ●熟练Struts2中文件的上传和下载功能。 ●熟练使用Struts2的标记完成页面的设计和展示。 ●熟练使用Struts2整合Tiles2框架进行页面模版配置和组装。 ●熟练使用Struts2Validator框架进行数据验证 授课计划(Weekly Schedule):

-Struts2处理结果的改进。 -Struts2支持的结果的类型和应用。-结果的配置。 -常见结果的使用。 -动态结果。 -请求参数决定结果。 -全局结果。1.实现各种结果的配置。2.编写Action实现到各种结果的处理。 4主题:Struts2配置 -Bean配置 -包配置。 -常量配置。 -命名空间配置。 -包含配置。 -拦截器配置。试验04: 1.编写Action。 2.配置Action。 3.配置常量 4.配置全局结果。 5.配置Action的命名空间。 5主题:拦截器 -拦截器基本概念。 -AOP编程思想。 -拦截器配置语法。 -Struts2内置的拦截器类型和职责。 -自定义拦截器的编程和配置。 -拦截器应用案例。试验05: 1.了解内置拦截器的使用。2.配置不同拦截器,测试Struts2的运行。 3.编写登录验证的拦截器,如果没有登录则到登录页面。 6主题:文件上传和下载 -文件上传的基本思想。 -文件下载的基本思想。 -编写实现文件上传的Action -配置文件上传的Action。 -使用Struts2控制文件下载。 -实现文件下载的Action。 -文件下载的权限控制。试验06: 1.编写实现文件上传的Action。 2.配置此Action。 3.将上传文件写入数据库。4.将数据库文件读出并实现文件的下载。 7主题:OGNL和类型转换 -什么是OGNL。 -OGNL与EL的区别。 -OGNL的基本语法。 -访问不同Scope中数据的OGNL语法。 -Struts2支持的自动类型转换。 -类型转换过程中的错误处理。试验07: 1.编写Action和Struts2页面读取SCOPE中保存的数 据。 2.完成表单提交中的数据类型转换。 3.编程和配置处理类型转换过程中出现的错误。 8主题:Struts2标记库(1)-FORM标记-Struts2内置的FORM表单元素标记。 -表单标记的通用属性。 -表单元素的name和value属性。 -checkboxlist标记。试验08: 1.使用Struts2的表单标记完成复杂表单页面的设计。2.Action中与页面表单标记的属性的设计和实现。

相关主题
文本预览
相关文档 最新文档