JdonFramework应用案例:新闻发布系统

05-03-12 banq

http://www.jdon.com/jdonframework/news.htm

欢迎批评指正,也欢迎更多程序员加入完善该系统。

zhangmingjing
2005-03-14 15:46

请问登录界面的用户名、密码是多少?

dkmilk
2005-03-14 22:10


 public User getUserByName(String username) throws Exception {
      logger.debug(" getUserByName " + username);
      Connection c = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      User ret = null;
      try {
        String GET_USER =
            "select  * from t_user where username = ?";
        c = dataSource.getConnection();
        ps = c.prepareStatement(GET_USER,
                                ResultSet.TYPE_SCROLL_INSENSITIVE,
                                ResultSet.CONCUR_READ_ONLY);
        ps.setString(1, username);
        rs = ps.executeQuery();
        if (rs.first()) {
          ret = new User();
          ret.setUserName(username);
          ret.setUserId(rs.getString("userid"));
          ret.setPassword(rs.getString("password"));

        }
      }
      catch (SQLException se) {
        throw new Exception("SQLException: " + se.getMessage());
      }
      finally {
        if (rs != null) {
          rs.close();
        }
        if (ps != null) {
          ps.close();
        }
        if (c != null) {
          c.close();
        }
      }
      return ret;
  }


这样写怎么看怎么感觉怪异。

ahbbxie
2005-03-16 14:39

>
>

> public User getUserByName(String username) throws
> Exception {
> logger.debug(" getUserByName " + username);
> Connection c = null;
> PreparedStatement ps = null;
> ResultSet rs = null;
> User ret = null;
> try {
> String GET_USER =
> "select  * from t_user where username =
> username = ?";
> c = dataSource.getConnection();
> ps = c.prepareStatement(GET_USER,
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> ResultSet.TYPE_SCROLL_INSENSITIVE,
> 
> 
> 
> 
> 
> 
> 
> 
> ResultSet.CONCUR_READ_ONLY);
> ps.setString(1, username);
> rs = ps.executeQuery();
> if (rs.first()) {
> ret = new User();
> ret.setUserName(username);
> ret.setUserId(rs.getString("userid"));
> ret.setPassword(rs.getString("password"));
> 
> }
> }
> catch (SQLException se) {
> throw new Exception("SQLException: " +
> on: " + se.getMessage());
> }
> finally {
> if (rs != null) {
> rs.close();
> }
> if (ps != null) {
> ps.close();
> }
> if (c != null) {
> c.close();
> }
> }
> return ret;
> }

>
> 这样写怎么看怎么感觉怪异。

hehe 用一个模板模式就可以就这些数据库通用操作封装起来,怎么banq没想起来啊。


banq
2005-03-19 16:20

>界面的用户名、密码是你插入数据库的数据,缺省是admin 123

模板模式建议很好,会加入的,其他getDatas基本都已经使用模板。

venlley
2005-03-19 21:02

域模型News等需要继承com.jdon.controller.model.Model接口,破坏了于模型。属于侵入式的应用。大家不会喜欢用的。

banq
2005-03-20 10:44

按照这种理论,EJB就没人用了,EJB都需要继承的,Spring更需要继承。这句话属于正确的废话。除非消灭语言的继承特性,就没有侵入了,这属于一种极端主义+理想主义言论,初学者切勿偏听偏信。

侵入特性对于实现软件蓝领化是有好处的,不需要给他们更多的自主余地,模块化编程,只需了解自己该做的,该继承实现的就可以,这种模式对于软件业是有好处的,虽然伤害现在程序员的感情,这话题谈开去了,sorry!



venlley
2005-03-21 15:05

谢谢彭老师的回复。
我当然希望国人有自己成功的框架产品。更敬佩那些孜孜不倦研究开发技术,并为软件业指路照明的人。

关于这里所讨论的侵入式,我的想法是:软件产业迟早要进入域类复用的时代,因此域模型尽量不要让它依赖于具体的实现框架。特别对于java开说,技术的变化更是日新月异,也许有一天,人们就从EJB的接口限定中挣脱出来,投入JDO等持久层框架产品中来。到那个时候,被侵入的哪些域类就很难移植了。

不知,我的思考是否正确。也许我是一个极端主义者。

另外,彭老师的框架能否借鉴JDO规范的方式,实现非侵入式应用。也许,有利于框架产品的推广。也许,我还没有看到框架实现所涉及的核心技术,口出枉言,敬请原谅。

banq
2005-03-21 16:15

多谢探讨。

>域模型尽量不要让它依赖于具体的实现框架

这种想法是好的,但是实际上并不是这样:Struts中的ActionForm类似界面模型,每个用户必须继承ActionForm。
HttpSession是依赖Web容器的东东,Spring中很多新概念必须依赖它的容器,等等。
等哪一天他们有技术实现不依赖了,Jdon也会采取同样技术。

那么在技术没有达到情况下,如何解决呢?
依靠标准啊,JSR就是这样一个标准组织,这样依据标准API就不依赖具体产品啦。


rubin_shao
2005-03-26 21:15

请教彭老师,在这个发布系统里面,如果我想获得当前登陆的用户名,应该到哪里取那?因为这个系统采用的是jboss实现的jaas,我想知道在容器验证登陆成功之后,把用户的信息存在哪里了?

banq
2005-03-30 16:03

>容器验证登陆成功之后,把用户的信息存在哪
使用request.getPrinciple可以获得用户的ID或名称,根据它自己去数据库查询这个用户的其它信息。

rubin_shao
2005-04-02 14:46

哦,谢谢解答,我还有个问题,我在jdbcDAO类里面加了如下代码
public static void main(String []args){
// JdbcDao dao = new JdbcDao();
try{
ServiceLocator se = new ServiceLocator();
DataSource dataSource2 = (DataSource) se.getDataSource("java:/NewsDS");
PageIteratorString pagejdbc = null;
pagejdbc = new PageIteratorString(dataSource2);
PageIterator page = new PageIterator();
page = pagejdbc.fetchDatas("","select typeid from T_NEWS_TYPE",0,20);
int count = page.getAllCount();
logger.info(count+"");
}catch(Exception e){
e.printStackTrace();
}

}
然后在jbuilder里面直接运行这个类会提示
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

我已经把mysql-ds.xml拷到jboss/server/default/deploy下了,还需要再加一个jndi-definitions.xml嘛??

banq
2005-04-03 10:02

这是jbuilder环境设置问题,可能你的JBuilder环境需要一个jndi-definitions.xml,我从Jb7使用到Jb2005,没有发现过这个问题,可能是你jbuilder导入包缺少点什么。

crystal81gz
2006-03-19 21:18

彭老师你好!我下载了Struts+Jdon+POJO/EJB新闻论坛系统的完整运行包,内含的MySQL启动正常,但是JBoss却不能正常启动,点击run.bat后出现"Failed to boot JBoss"的问题,不知道是什么原因,请彭老师指点

banq
2006-03-20 11:48

环境变量JAVA_HOME需要设置