你的分享就是我们的动力 ---﹥

ssh学习笔记

时间:2011-12-20 15:39来源:www.chengxuyuans.com 点击:

记录下我学习ssh也就是struts2+spring+hibernate的一些遇到的问题。
首先是要配置ssh的学习环境。 ssh的jar包要找全 包与包之间也不能有冲突。要不然会出错的。我是找了一个视频里面的 ssh jar包
然后就是整合ssh了,一般来说先是整合 spring和hibernate.
首先是建立实体类xxx 配置你实体类的 xxx.hbm.xml文件,配置bean.xml文件 这里有数据库源,sessionFactory等等
配置数据源的时候
dbc:mysql://localhost:3306/jsp?useUnicode=true&characterEncoding=gb2312
characterEncoding的编码要与数据库的编码一致,我开始就是把 characterEncoding设置了utf-8而我的数据库编码是gb2312所以
后来插入中文数据的时候出错。
然后hibernate就可以制动创建数据库表了
接下来就是配置struts了 就是配置 web.xml 和struts.xml文件
在web.xml里对spring 容器实例化
在用struts2 <s:form></s:form>表单的时候 遇到提交乱码问题 我干脆就不用它了
还有提交的参数是中文要进行转码。否则的话 数据库里是乱码
public void setArticle(String article) throws UnsupportedEncodingException {
        this.article = new String(article.getBytes("ISO-8859-1"), "utf-8");
    }
比如这样 也可以在web.xml配置 filter 还可以用spring的字符编码
如果你是tomcat 还可能要更该server.xml 配置文件
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />
我改了tomcat之后 都不用配filter了 。。。
action向页面传值 好像看书上都是用
ActionContext.getContext().put(key, value); requset范围
ActionContext.getContext().getApplication().put(key, value) application范围
ActionContext.getContext().getSession().put(key, value)  session 范围
一般都是用requset范围;
然后就是jstl/el表达式了

然后就是sql 语句的学习了 hibernate用到的是 hql 和 Criteria
我在用hql的时候遇到一个问题
String hql="select art.id,art.title,art.date from Article art";
String hql2="from Article art";
Query query=sessionFactory.getCurrentSession().createQuery(hql);
    List<Article> list=query.list();
        return list;
action里是
ActionContext.getContext().put("list", articleDao.findlist());
然后jsp页面是
<c:forEach var="item" items="${artlist}" >
${item[0]}
${item[1]}
<br/>
</c:forEach>
就是说 如果是 String hql2="from Article art"; 这样查询返回的是对象
页面上就可以用
${item.id}
${item.title}
来访问
但是 如果是 String hql="select art.id,art.title,art.date from Article art"; 这样查询返回的就数组 必须通过下标访问
${item[0]}
${item[1]}

1.query.setFirstResult(0);  查询结果从0开始
2.在aciton里往数据库添加当前时间的时候比如这段代码
Article at = new Article(title, article, new Date(), 1);
        articleDao.addArticle(at);
每次hibernate都会更新数据库其他记录的时间 解决方法
在实现接口的类里添加时间
public  void addArticle(Article article) {
        article.setDate(new Date());
    sessionFactory.getCurrentSession().save(article);   
    }

3.数据库编码问题 一般都是用utf-8,保持页面和数据库编码一致,我们创建数据库的时候可以指定数据库的编码
比如
CREATE DATABASE `payment` /*!40100 DEFAULT CHARACTER SET utf8 */;

今天把公司svn上的天气代码拷贝到我本地一个myeclipse项目,把jar包都导入了还是发现报错,检查了下发现是@override的问题
@override去掉就可以了。百度一下原因是我的myeclipse项目用的是编译jdk是1.5版本的,改成1.6的就ok了。具体原因是:
@override 注释在 jdk1.5 环境下只能用于对继承的父类的方法的重写,但不能用于对实现的接口中的方法的实现。(也就是 jdk1.5  @Override 这个 annotation 并不把接口认为是超类 ,也就是说 如果在 1.5 下要使用 @Override 这个 annotation 必须保证 被标注方法来源于 class 而不是 interface . 具体原因不明,可能是 jdk 1.5 linux 下的一个 bug 吧)

在同事的帮助下今天终于把ejb+jpa+struts2+jboss本地搭建好了 数据库也连好了
在用jsp显示数据的时候遇到个异常“ org.apache.jasper.JasperException: File "/struts-tags" not found ”
找了好久的原因后来发现公司目录下有个struts-tags.tld 文件没拷贝过来,我就试着把这个struts-tags.tld 文件拷贝到项目的web-inf目录下
果然可以正常显示了。。
另外编译发布的时候,只要是放在jboss deploy 下的,都不要重启

今天在调试程序的时候用出现一个异常“java.lang.NoSuchFieldError”
搞了很近后来在网上搜索可以是多加个jstl.jar包 我想起我开始是加个次jstl包,把这个包从类路径下去掉果然可以了。
Struts的请求参数是set方法的参数 不是字段
比如 private String name;
     public void setName(String name) {
        this.name = name;
    }
这时候url的请求参数是 Name 而不是 name
调试freemarker的时候 要在action里为freemarker的属性设置set和get方法 这样模版就可以接收到属性
在struts如果action设置了属性的get和set方法 在视图里就可以直接得到属性的值 不需要转发
D:将u.txt转换为本地编码,输出到文件u_nv.txt
jdk巧命令
native2ascii -reverse u.txt u_nv.txt


今天在本地机器调试天气小时数据爬取代码的时候总是出现xml content is not well-formed, return null 但在main函数里直接运行用是好的,而且线上同样的代码也是好的.
具体出错的代码是
SAXReader saxReader = new SAXReader();
        Document document;
        try {
            document = saxReader.read(new ByteArrayInputStream(hourLiveTxt
                    .getBytes()));
        } catch (DocumentException e) {
            log.warn("hourLive xml content is not well-formed, return null");
            return null;
        }
想到可能是编码的问题百度了一下发现一段这样的代码
SAXReader saxReader = new SAXReader();
byte[] bytes = requestMsg.getBytes();
InputStream in = new ByteArrayInputStream(bytes);
InputStreamReader strInStream = new InputStreamReader(in, "GBK");
Document document = saxReader.read(strInStream);
于是把代码改成
 SAXReader saxReader = new SAXReader();
        Document document;
        byte[] bytes = hourLiveTxt.getBytes();
        InputStream in = new ByteArrayInputStream(bytes);
        InputStreamReader strInStream = null;
        try {
            strInStream = new InputStreamReader(in, "utf-8");
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        try {
            document = saxReader.read(strInStream);
        } catch (DocumentException e) {
            log.warn("hourLive xml content is not well-formed, return null");
            return null;
        }
解决了

本文地址http://www.chengxuyuans.com/Javaframework/32415.html