分享
 
 
 

Using Struts With Java Data Objects

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Using Struts With Java™ Data Objects

Persistence/Web Framework

“学习如何使用Struts和Java™ Data Objects(JDO)来建构可升级、模块化的WEB应用程序。”

本文从以下几个方面逐一阐述:

1. Struts Key Concepts

2. JDO Key Concepts

3. 初始化Servlet

4. 在Actions中方问持久层数据

5. 缺陷和误区

6. 概要

7. 原文作者

下面逐一分析:

1.Struts Key Concepts

1) Struts Controller(ActionServlet)

l Model-View-Controller 模式

l Model=(Persistent data)可以持久化的数据;

View=显示层 (JSP™ page)

Controller=控制层{Servlet(Struts ActionServlet)}

-Controller接受HTTP请求

-Controller用action form来封装来自的client端的数据,并调用formbean中的validate()方法来对封装的数据进行校验,如果校验中发现错误可以进行回写。

-Controller调度action去处理校验过的form bean.

2)struts key concepts

3)Struts Actions Classes

开发员可以开发自己的ApplicationAction,只要其继承Struts Action class

-Action 处理逻辑事务或者移交给专门处理业务逻辑的类模块。

-Action 返回业务对象继续处理其他的事务或者直接返回client端通常为 JSP™ page.

-

4)Srevlet Filter

-每一个请求都要经过Filter

-可以定制Filter来访问特定的资源

-调用其他的Filter或者Struts ActionServlet

-注意捕获异常

2.JDO Key Concepts

2.1 Java™ Data Objects Key Concepts

1) PersistenceManagerFactory

-工厂方法来创建PersistenceManager

2) PersistenceManager

-create/delete 持久对象

-Query factory

3) Query

-根据不同的查询条件来得到持久对象集合

4) Transaction

-Begin,commit,rollback

5) Query返回持久对象的集合

6) 持久对象就是你的应用程序中的Plain Old Java™ Objects,如:Customer、Order、OrderLine、Part等等

7) Use methods on instances without regard for struts,Web container,HTTP

8) 持久化的数据的更新有JDO产品隐藏处理

2.2 JDOFilter

public class JDOFilter implements javax.servlet.filter{

private PersistenceManagerFactory pmf;

public void init(FilterConfig fc){

initializePMF(fc);

}

public void doFilter(…) throws IOException,ServletException{

PersistenceManager pm=null;

Try{

Pm=initializePM();

Chain.doFilter(…);

FinalizePM(pm);

}finally{

abnormalPM(pm);

}

}

…..

}

3. 初始化Servlet

3.1

l Container 调用Filter.init() 来初始化PersistenceManagerFactory

-查找/创建 PersistenceManagerFactory

-通过JndiName(如果容器支持JNDI)

-J2EE™ Application Server environment

-通过ResourceName(if not)

-ResourceName 标示特定的拥有配置信息的properties文件

l 存储PersistenceManagerFactory到filter实例中

3.2 Filter 配置信息

[添加到web.xml中]

<filter>

<filter-name>MediaManiaPMF</filter-name>

<filter-class>

com.mediamain.appservre.JDOFilter

</filter-class>

<init-param>

<param-name>path</param-name>

<param-value>

/WEB-INF/jdoMovies.properties

</param-value>

</init-param>

</filter>

3.3 jdoMovies.properties

[放在应用程序包web-inf下]

下面的内容跟原文不同,在此处我使用另外一种JDO产品:JDOGenie(http://www.hemtech..co.za)

jdoMovies.properties的内容如下:

# Server name (must be unique on a machine)

server=jdogenie1

remote.access=false

remote.pm=false

hyperdrive=true

# JDO Genie version

version=1.4.10 (04 Jul 2003)

# Data stores

storeCount=1

store0.name=main

store0.type=jdbc

store0.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver

store0.url=jdbc\:microsoft\:sqlserver\://localhost

store0.db=mssql

store0.user=song

store0.password=song

store0.properties=DatabaseName\=jdotest;SelectMethod\=cursor

store0.maxActive=5

store0.maxIdle=2

store0.init.sql=

store0.wait.for.con.on.startup=false

store0.validate.sql=

store0.test.on.alloc=false

store0.test.on.release=false

store0.validate.mapping.on.startup=false

store0.test.on.exception=true

store0.retry.interval.ms=1000

store0.retry.count=10

store0.pscache.max=

store0.ext.jdbc-key-generator=-

store0.jdbc.namegen=-

# .jdo resources

jdoFileCount=1

jdo0=system.jdo

# Properties for JDOHelper.getPersistenceManagerFactory(...)

javax.jdo.PersistenceManagerFactoryClass=za.co.hemtech.jdo.client.BootstrapPMF

javax.jdo.option.Optimistic=true

javax.jdo.option.RetainValues=false

javax.jdo.option.RestoreValues=false

javax.jdo.option.IgnoreCache=false

javax.jdo.option.NontransactionalRead=false

javax.jdo.option.NontransactionalWrite=false

javax.jdo.option.Multithreaded=false

# Event logging

event.logging=-

# Cache settings

cache.enabled=true

cache.maxobjects=10000

cache.listener=-

query.cache.enabled=true

query.cache.max.queries=10000

# Data store 0 mappings

store0.jdbc.type.count=0

store0.jdbc.javatype.count=0

# JDO Genie Meta Data Editor properties (not used at runtime)

mdedit.classPathCount=4

mdedit.cp0=E\:/rms15/lib/mssqlserver.jar

mdedit.cp1=classes

mdedit.cp2=E\:/rms15/lib/msbase.jar

mdedit.cp3=E\:/rms15/lib/msutil.jar

# JDO Genie Class Diagrams (not used at runtime)

diagram.count=1

diagram0.name=Diagram 1

diagram0.legend=600,460

diagram0.general=13,Y,Y

diagram0.class=Y,N,Y,N,N,Y,N,Y,N,N,N,N,N,N,N,N,N

diagram0.field=Y,Y,N,N,N,N

diagram0.class.count=0

{别怕他长,JDOGenie自带的可视化工具可以帮助你完成}

3.4 PersistenceManagerFactory Initialization

……接上 JDOFilter代码……

protected void initializePMF(FilterConfig fc){

String propsname=(String)fc.getInitParameter(“path”);

Properties props=loadProperties(propsname);

Pmf=JDOHelper.getPersistenceManagerFactory(props);

}

protected Properties loadProperties(String pathName){

…….

}

3.5 PersistenceManager Initialization

……接上 JDOFilter代码……

protected PersistenceManager initializePM(){

PersistenceManager pm=pmf.getPersistenceManager();

Request.setAttribute(“jdo.PM”,pm);

Return pm;

}

protected void finalizePM(PersistenceManager pm){

pm.close();

request.removeAttribute(“jdo.PM”);

}

protected void abnormalPM(PersistenceManager pm){

if(pm.currentTransaction().isActive()){

pm.currentTransaction.rollback();

}

pm.close();

request.removeAttribute(“jdo.PM”);

}

4.。在Actions中方问持久层数据

l Action 或者 JSP™ page都可以访问持久性数据

l 从Request中获得PersistenceManager

l 使用PersistenceManager 就象两层结构一样:Action整合query,然后授权相应的业务组件来具体处理应用程序的业务逻辑。

l 持久性数据通过Request传递

l “一个请求一个PersistenceManager”(“PersistenceManager per Request”)模式

4.1 Action 处理实例

class LookupMovieAction extends Action{

protected ActionForward execute(….){

PersistenceManager pm=(PersistenceManager)request.getAttribute(“jdo.PM”);

Query q=pm.newQuery(Movie.class,”genre==param1”);

q.declareParameters(“String param1”);

String movieName=(String)request.getParameter(“movieGenre”);

Object movies=q.execute(movieName);

Request.setAttribute(“Movies”,movies);

Return (mapping,findFoward(“displayMovies”));

}

}

4.2 事务

l 大多的Actions 都不需要掺杂事务在里面

-Insert,delete,update需要进行事务处理

-其他的用nontransactional来处理

l JSP™ pages通常不需要事务处理

l 如果必须进行事务处理,那么begin()和commit()将需要在Action execute()中调用

l 如果要使用多个PersistenceManagers,那么事务将不能被调节

-如果必须要控制事务,那么考虑使用EJB架构

5.缺陷和误区

l 不要再Action/JSP™ page中关闭PersistenceManager

-持久性对象是“有生命”的,关闭PersistenceManager相当于“杀死”他们。

l 如果使用事务,那么一定要在业务方法中使用try/catch,而且要在catch或者finally中调用事务的回滚rollback().

l 不要在一个action中开启一个事务而在另一个action关闭它。

l 如果要使用多个PersistenceManagers,那么必须定义多个JDOFiltes

6. 略

7. 原文作者:

Craig Russell :the Specification Lead for Java™ Data Objects(JSR 12) at Sun Microsystems,最新的一版《Java Data Objects》的其中一位作者

Craig McClanahan:the author and chief evangelist for the Struts framework(挑我们最熟悉的说,和和。。。)

Amy Roh is a developer on the JSP™/Servlet team working on Tomcat

原文连接:

http://servlet.java.sun.com/javaone/resources/content/sf2003/conf/sessions/pdfs/3368.pdf

不能算是翻译,如果你英文可以的话请直接阅读原文。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有