??xml version="1.0" encoding="utf-8" standalone="yes"?>
首先说一下整体框架appfuseQ它是集成了当今最行的web应用框架的更高层ơ的web开发框Ӟ也可以说是一个web开发的基本q_Q它当前最行的一些技术,比如hibernate,spring,struts,DBUnit,ant,log4j,xdoclet,sitemesh,velocity,jstl,webwork,{等都集成了q来Q在国内能够这些都应用q来的ƈ不多见.
待箋Q.Q.
q里的多数元素都是可选的 - 你真正必ȝ道的是指定一个creator和一个javascript名字?/p>
creator属?/strong> 是必ȝ - 它用来指定用那U创造器?/p>
默认情况下DWR1.1?U创造器。它们是Q?/p>
javascript属?/strong> 用于指定览器中q个被创造出来的对象的名字。你不能使用Javascript的关键字?/p>
scope属?/strong> 非常cMservlet规范中的scope?它允怽指定q个bean在什么生命范围。选项?application", "session", "request" ?page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了?/p>
scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写?/p>
param元素 被用来指定创造器的其他参敎ͼ每种构造器各有不同。例如,"new"创造器需要知道要创徏的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接?/p>
include和exclude元素 允许创造器来限制类中方法的讉K。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗C默认的讉K{略?拒绝"Q如果是exclude列表则暗C默认的讉K{略?允许"?/p>
通过研究uk.ltd.getahead.dwr.DWRServletq个servlet来研I下dwr到底是如何工作的?br>
5 dwr.jar下蝲后放lib?br>
源码析
dwr的设计很象webwork2的设?隐藏http协议,扩展性,兼容性及强?/p>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
q样/dwr/*下的所有的h都是p个servlet来处?到底生理了什么呢,我们q是以例子来说明?
1 web服务器启动,DWRServlet init()Ҏ调用Qinit主要做了以下工作?
讄日志U别、实例化DWR用到的单例类Q这些类在jvm中只有一个实例对象)、读去配|文Ӟ包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xmlQ?br>2 h处理
DWRServlet.doGet, doPostҎ都调用processor.handle(req, resp)Ҏ处理。Processor对象在init()Ҏ中已l初始化了?nbsp;
代码
public void handle(HttpServletRequest req, HttpServletResponse resp)
throws IOException
{
String pathinfo = req.getPathInfo();
if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))
{
resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html"))
{
doIndex(req, resp);
} else
if(pathinfo != null && pathinfo.startsWith("/test/"))
{
doTest(req, resp);
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js"))
{
doFile(resp, "engine.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js"))
{
doFile(resp, "util.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js"))
{
doFile(resp, "deprecated.js", "text/javascript");
} else
if(pathinfo != null && pathinfo.startsWith("/interface/"))
{
doInterface(req, resp);
} else
if(pathinfo != null && pathinfo.startsWith("/exec"))
{
doExec(req, resp);
} else
{
log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");
resp.sendError(404);
}
}
dwr/*处理的请求也p几种?br>
Q?Qdwr/index.htmlQdwr/test/q种只能在debug模式下用,调试用?
dwr/engine.jsQdwr/util.jsQdwr/deprecated.js当这个请求到达,从dwr.jar包中d文g,响应回去。(重复h有缓存)
Q?Q当dwr/interface/q种h到来Q(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>QDWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date转化为javascript函数?
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧?
l节也比较简单,通过java反射Q把Ҏ都写成javascript特定的方法。(我觉得这些{换可以放到缓存里Q下ơ调用没必要再生成一遍,不知道作者ؓ什么没q样做)?
Q?Qdwr/exec
javascript调用Ҏ时发送这U请求,可能是XMLHttpRequest或IFrame发送?
当然Qjavascript调用的方法签名与java代码一_包括参数Q还有javascript的回调方法也传到了服务器端,在服务器端很Ҏ实现。回调方法的java的执行结?q回cM <script>callMethod(l果)<script>的javascript字符?在浏览器执行。哈Q一切就q么单,巧妙?br>
我这里还有DWR中文文档. http://www.tkk7.com/Files/LiuTing/DWR中文文档.rar
]]>
W一部分Qauthentication
1、acegi通过AuthenticationProcessingFilter拦截loginh获取Principal和Credential信息Q通俗一点就是用户名和密码)Q?/span>
2、验证用户名密码Q由q个Filter调用认证理器AuthenticatiomManagerq行验证?/span>
AuthenticatiomManager本nq不具备验证的功能,它相当与是一个验证控制器Q由它来理验证的过E及方式。AuthenticatiomManager是通过调用provider来进行验证的Q一个manager中可以具有多个providerQ但只要有一个provider验证通过Qmanagerp为验证成功?/span>
q部分要明白三点Q一Qprovider是可以配|进ȝQ因为acegi是基于spring的;二是AuthenticatiomManager是可以被重写的,你可以将managerҎ你自己希望的控制器;三,好好利用eventQ这是标准的observer模式。acegi中的设计模式研究在以后的脓子中讨论?/span>
3、providerq行验证?/span>
provider是真正的验证模块Qƈ且决定了验证的模式。provider目前acegi提供了dao、jaasQcasQx509Qldap{几U验证方式,q些验证方式的具体内容可以查阅acegi的文档。provider验证通过后将Authentication对象q回?/span>
4、AuthenticationProcessingFilter对象保存到ContextHolder中。Authentication部分l束?/span>
W二部分Qauthorization
1、用h交请求,拦截器FilterSecurityInterceptor拦截hQ拦截器是一个Filter.
2 、鉴权,拦截器调用AccessDecisionManagerq行鉴权?/span>
AccessDecisionManager是通过投票的方式来军_是否有权限访问资源。所谓投就要包括投的参与者和投票的策略?/span>
投票的参与者decisionVotersQ这是AccessDecisionManager的一个属性。decisionVoter能从某一个角度决定用h否能讉K资源Q例如RoleVoter来判断用L角色是否有权限访问资源,MaxuserVoter来决定某个资源的讉K用户数是否已l达C最大值等?/span>
投票{略。投的{略是通过不同的AccessDecisionManager来实现的Q例如acegi提供的AffirmativeBased对象Q这个对象的{略是只要有一个投通过全体通过。UnanimousBased对象的策略是必须全体投票通过才能通过。但在大多数情况下acegi提供的AccessDecisionManager不能满我们的要求,q就需要我们去实现AccessDecisionManager接口Q去定制适合自己目的策略?/span>
q个情况比较复杂Q因为是要对Actionq行调用Q所以要看用的web框架来定夺。是用不同Web框架要是用不同的Web框架拦截器。所以恐怕acegi力不从心Q挺多在filter里面配置一下是否要是用Action自n校验。但是想法很好,赞?/p>
acegi校验p|的时候会抛出AuthenticationException异常Q然后放在session里面Q?
在错误{向页面可以这h?
老版的web.xml
q个是用来显CZ的权限信息的?/p>
q个是p|的时候{到的地方Q我们可以配|url和是否用https
q个是前面提到的拦截器。简单解释一下:
authenticationManager 在acegi里面的主要作用就是管理维护用L权限角色{信息,比方说想要用LROLEp在这里面拿了。里面配|了多种全县的来源,可以从DAO里面?是数据库里?Q可以是cookies里面的,也可以是匿名的权限,每种权限都以一UProvider的Ş式提供:
objectDefinitionSource在acegi里面是配置权限信息Q说明哪一个url需要什么权限才能访问,acegi默认?lt;value>来表C,其实q正是acegi的不之处,q好能够补救。我来说明一下:
我们知道在spring里面<value>标签比较ҎQspring首先扑ֈq个属性的cdQ然后把value里面的内容以String的类型取出来(Spring做了一下包装,为TypedString)。然后根据这个属性的cd找他的EditerQ然后用Editer来处理String为需要的cd。但是我们不希望用String来表达urlQ很明显url里面?׃会玩了。我们可以把q个信息写到数据库里面,然后dQ这里面不说了以前有一位高手已l解释过了?/p>
接下来就是httpRequestAccessDecisionManager了,AccessDecisionManager在acegi里面是决{者,是Ҏ你所拥有的权限和讉KURL需要的权限来决定你到底能不能访问?/p>
决策者里面是投票者,q个上面已经解释q了Q一个投者校验一U权限。整个流E已l说完了?/p>
BIRT是一?span>Eclipse-based开放源代码报表pȝ。它主要是用在基?span>Java?span>J2EE?span>Web应用E序上?span>BIRT主要׃部分l成Q一个是ZEclipse的报表设计和一个可以加C应用服务的运行期lg?span>BIRT同时也提供一个图形报表制作引擎?/span>
使用BIRTQ能制作出多样化的报表到你的应用中。比如:列表 lists ,图表 charts,混合报表 Compound ReportsQ交叉表Q二l表Q?span>CrosstabsQ二l报表目前在BIRT
2.1>birt的安?br>
Eclipse 3.1 支持 BIRT 2.0
Eclipse 3.2 支持 BIRT 2.1
目前我用的版本?span>BIRT
Ҏ一Q?/span>
?span>Eclipse的官方网?span>http://download.eclipse.org/birt/downloadsM?span> BIRT 插gQ?span>birt-report-designer-all-in-one-2_1_1Q,解压后,它就是一个拥?span> BIRT插g?span>Eclipse。如果你已经安装?span>Eclipse,那么把下载的文g夹的内容拷到所对应?span> Eclipse 的文件夹里(plugins?span>features两个目录Q,之后的第一ơ启动是通过DOSq入?span>Eclipse目录Q启?span> Eclipse -clean 命oQ此命o是清?span> Eclipse ~存里的记录q启?span>Eclipse。这也是最单的安装BIRTҎ?/span>
Ҏ二:
BIRT 2.1开始,可以?span> Eclipse 里直接下载?span>[帮助]à[软g更新]à[查找q安?span>]
Ҏ三:
如果你的 Eclipse 已经安装或者不想用方法一安装Q可以进行分别安装的Ҏ?span>EMF, GEF ?span> BIRT 都是需要通过 Eclipse download page下蝲的。请注意以下的配|要求:
GEFQ图形编辑框Ӟ是一个通过 BIRT UI 使用?span>Eclipse 插g
EMFQ用来制作图表的框架
具体的安装和配置请参?Eclipse官方|站 q里我还推荐一?span>BIRT 2.0.1的安装视?/span> 希望对大家有所帮助?/span>
注意Q?/span>iTextAsian.jar 是ؓ了支持用PDF输出时亚zh的字体?span>prototype.js 是安?span> BIRT
提示Q?/span>我个Z用的是方法一Q首先安装比较方便,其次如果使用Ҏ二,?span>Eclipse [帮助]à[帮助内容] 里没有关?span> BIRT 的帮助文档,q样对学习不是很方便?/span>
2.2 birt版本升
1Q?span>删除?plugins 目录下的所有以 org.eclipse.birt 开头的文g?br>
2Q?/span>按照上面的方法一q行安装?/span>
3Q?/span>重新启动 Eclipse -clean
2.3 语言包安?/p>
目前 BIRT?st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1 已经有中文语a包。下载完毕以后把对应的目?span> copy 到对应的 Eclipse 目录下,然后 Eclipse -clean 启动?/span>
在这里我提供了一?“BIRT中文教程”Q在Eclipse官方|站也有它的演示视频Q?span>Customers.rptdesign 是做好的报表?/span>
JDBC Drivers
以上例子介绍的是使用“CZ数据?#8221;的数据源Q在大多数情况下我们使用的是自己?span>JDBC driverQ下面介l连?span> Oracle 数据库?/span>
打开 Eclipse 后进?span> [H口]à[打开透视?span>]à[报表设计]Q新建项?span> [文g]à[新徏]à[目]Q选择“业务和报表工?#8221;à“报表目”Qv目名。新建的目上,右键 新徏报表Q给报表起名字,报表的后~名是 .rptdesign
[数据?span>]à[新徏数据?span>]Q选择“JDBC数据?#8221;Q别忘了l数据源起名字)Q?#8220;理驱动E序”à“d”Q把所需要的数据?span> jar 包添加进来。选择oracle.jdbc.driver.OracleDriver ( v1.0)Q写上正的数据?span> URLQ用户名Q密码,点击“试q接”Q显C?q接成功?/span>
报表的种cL很多Q具体的制作q程参?span>[帮助]à[帮助内容]
提示Q?/span>交叉表即二维报表在目?span>BIRT
BIRT
4.1. tomcat 部v
我用的版本?span> tomcat 5.5Q步骤如下:
1) mail.jar activation.jar拷到Tomcat 5.5\common\lib
2) iTextAsian.jar itext-1.3.jar拷到
WebViewerExample\WEB-INF\platform\plugins\com.lowagie.itext\lib
3) q接数据库的包拷?/span>
WebViewerExample\WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_
4) WebViewerExample整个目录copy ?Tomcat 5.5\webapps?span>,可以更改文g夹名?/span>
5) 完成的报表可以直接复制到根目录下Q也可以新徏文g夹目录?/span>
现在BIRT支持两种览报表模式Q?span>frameset是支持显C分늚Q采?span>Ajax技术?span>run暂不支持昄分页Q直接输?span>HTML。比较一下它们的区别Q如下:
http://localhost:8080/WebViewerExample/frameset?__report=Customers.rptdesign
http://localhost:8080/WebViewerExample/run?__report=Customers.rptdesign
注意Q?/span>
a) 问号后面的是双下划线
b) 以上报表是放在根目录下,如果是放在自己新建的目录比如 myreport ?span>URL应是Q?/span>
http://localhost:8080/WebViewerExample/run?__report=myreport/Customers.rptdesign
4.2. Weblogic Server 部v
我用的版本?span> Weblogic Server 9.2Q它?BEA WebLogic 产品的一部分?span>BEA WebLogic Server 是一个功能丰富、基于标准的现成的企?span> J2EE应用服务器?/span>
Weblogic Server 有很多的域组成,medrec
?wl_server 是其中自带的域,也可以自己创建新的域。域中可以包含许多服务器Q在服务器中可以部v许多的应用程序。域有一个默认的服务器,它是理服务器。每个域中的理服务器是唯一的,其他创徏的服务器叫受服务器?/span>
Weblogic Server 的安装就不多做介l了Q主要介l它的配|和部v。下面介l一下新建域和部|的步骤Q?/span>
1) q行开?span> -> E序 -> BEA Products -> Tools -> Configuration Wizard
2) 选择 Create a new WebLogic domainQ?span>Next?/span>
3) ?span> Select Domain Source 界面保持默认Q?span>Next?/span>
4) ?span> User name 处输入用户名Q如 userQ?span>password 输入密码Q如12345678Q密码要?span> 8 位)Q?span>Next?/span>
5) ?span> Configure Server Start Mode and JDK 界面中保持默认,?span> JDK 选择的是“Sun SDK
6) ?span> Customize Environment and Services Settings 界面中默认ؓ NoQ?span>Next?/span>
7) ?span> Domain name 处输?span> mydomainQ点?span> Create?/span>
8) 完成后点?span> Done 关闭 Configuration Wizard 对话框?/span>
9) q行开?span> -> E序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server DomainQ启动创建域的服务器。如果最后显C?<Server started in RUNNING mode> 则说明服务器启动成功?/span>
10) 在地址栏输?http://localhost:7001/console q入理控制収ͼ输入刚才的用户名和密码。点?更改中心 ?span>[锁定q编?span>]Q域l构 中的[部v]Q点?span>[安装]。找C要部|的应用E序Q之后都为默认,最后点完成。在更改面上点?span>[保存]Q?a name=startstop1208193__startstop1208210>完成所需的更改后Q单?更改中心 中的[ȀzL?/span>]?strong>注意Q?/strong>只有点击?span>[ȀzL?/span>]后才真正保存了更攏V某些在理控制C所做的更改在激zd立即生效。有些更攚w要重新启动此更改影响到的服务器或模块。后面的q些更改UCؓ非动态更攏V非动态更改在理控制C由此警告图标表示Q?span> 如果寚w动态配|设|进行了~辑Q则只有在重新启动服务器之后Q所有对动态配|设|所q行的编辑才会生效?/span>
11) 点击 域结?中的[部v]Q启动刚才部|的应用E序?/span>
12) 在地址栏中输入 http://localhost:7001/部vE序名在web中显C应用程序?/span>
BIRT的部|方法基本和上面步骤相同Q注意一点,在部|前?/span>
commons-logging.jar 拷入 WebViewerExample 中的 lib 包中Q否则最后显CZ报错?/span>
Weblogic Server 的部|方法有很多Q?/span>weblogic.Deployer、管理控制台?span>WLST {等。刚才介l的理控制台的部vQ它是一个可视化的界面,用v来比较方ѝ?/span>
推荐Q?/span>在这里推荐用一U应用程序的目录理ҎQ新建目录结构如下:
C:myApplication app plan 你的应用程序放入此目录 部v完后会再此目录下自动?/span>plan.xml文g
用此目录有利于很好的理配置文g?/span>
关于 Weblogic 的更多详l资料,我这里推荐几个比较好的官方学习网站:
www.bea.com.cn bea的品网?/span>
edocs.bea.com.cn bea的比较系l的学习|站
dev2dev.bea.com.cn 一般介l?span>bea的最新技术,动态等的网?br>
4.3. web外观昄
部v好的报表面昄样式是固定的Q在多数情况下我们都希望修改外观Q下面将Ҏ做简单介l?/span>
Webcontent是主要文件夹Q?/span>
1) Webcontent中的ajax目录Q完成了?span>web上显C的报表分页的功能?/span>
2) Styles目录中的style.css是整个报表在web上显C的外观Q包括工h颜色Q字体。文件注释很清楚Q具体修改可以参见注释?/span>
3) pages目录pages/control/ NavigationbarFragment.jsp 分页那一条工h?span> JSP pages/control/ ToolbarFragment.jsp 工具按纽JSPQ可以修改以保留自己惌使用的功能按U?span>pages/control/ ProgressBarFragment.jsp 它是昄刚开始读取报表时Q显C条的样式?/span>
4) Layout目录 FramesetFragment.jsp 可以修改报表标题?/span>
?WEB-INF/web.xml文g中,BIRT_VIEW_REPORT_ROOT 是配|报表\径的属性,如果没有配置则是默认路径Q?span>$tomcat$\webapps\birt
目前?span>web上显C的所有的都是英文。项目有一个资源文Ӟ打包?span>lib/viewservlets.jar中,…/…/resource/messages.properties文g中。显CZ文的解决Ҏ是,?span>unicode转换器把要显C的中文事先转换好,然后替换资源文g中的英文?/span>
BIRT是目前比较常用也是比较方便,效率较高的报表制作工兗当然其发展旉不长Q所以还有很多的~陷和未完善的地方,之后的版本也在不断改q,因此我也会一直跟t它的技术发展,不断更新我的文档?/span>