class="MsoNormal" style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; font-size: 14.44444465637207px; line-height: 23.33333396911621px;">com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'hbstpdb.hbstpdb__newskinds' doesn't exist
如去我们的newskinds.hbm.xml文件中找到这个语句
<class name="com.ngworld.bookstore.vo.Newskinds" table="newskinds" catalog=”hbstpdb”>
把上面的这个模式名(catalog=”hbstpdb”)删掉就不会出现上面的错误了
?
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():
?
异常原因:
<id>元素配置不正确,<id>元素缺少其子元素<generator></generator>的配置。
解决方法:
<id>元素映射了相应数据库表的主键字段,对其子元素<generator? class="">,其中class的取值可以为increment、identity、sequence、hilo、native……等,更多的可参考hibernate参考文档,一般取其值为native??。
?
所以我们去我们的vo包中,找我们对应的.hbm.xml的文件,把文件中的<id>配置改成increment就可以了(mysql)
如果我们用的是oracle数据库的话,多表的话我们是要建立sequence(序列的),所以也要把相应的序列文件加到里面
如:
<id name="id" type="java.lang.Long">
??<column name="ID" precision="22" scale="0" />
?<generator class="sequence" >
<param name="sequence">productseq</param>
</generator>
??</id>
?
protected Object FormBackingObject(HttpServletRequest request) throws Exception {
??????????????String id = request.getParameter("articleId");
??????????????Article list = articleService.getArticleById(id);
??????????????request.setAttribute("article",list);
??????????????return super.formBackingObject(request);
???????}
Article?是表?list是取出表中指定id的字段,然后通过request把list的值返回到页面中,在页面中就可以用article了,比如$(article.id)?这个里面的id是表的字段,然后通过这个jstl语句就可以取出article表中的id了,但是${article.id}的artciel必须和request.setAttribute("article",list);中引号中的变量一致,如果引号中换了别的变量则在引用中则用那个变量名,如:
request.setAttribute("articlelist",list);
那么在jsp中就这么引用${articlelist.id}
?
如果在控制台中报了如下的错误:
2008-08-20 17:09:57,812 ERROR [org.hibernate.LazyInitializationException] - <could not initialize proxy - the owning Session was closed>
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
解决方法1:
这里告诉我们session已经关闭了,所以我们要把我们的hibernate的.hbm.xml文件中的
Class中要把我们的lazy设置成false这样的错误就可以解决了。(注:记住这个是外键表的.hbm.xml文件,比如a表ID和b表ID是关联,b表ID是a表的外键,这个文件是b表的文件,只有lazy加在b表才有作用)
例:
<hibernate-mapping>
????<class?name="com.ngworld.bookstore.vo.Department"?table="department"?lazy="false">
????????<id?name="departmentId"?type="java.lang.Integer">
????????????<column?name="DepartmentID"?/>
????????????<generator?class="increment"?/>
????????</id>
????????<property?name="name"?type="java.lang.String">
????????????<column?name="Name"?length="50"?not-null="true"?/>
????????</property>
????????<property?name="description"?type="java.lang.String">
????????????<column?name="Description"?length="1000"?/>
????????</property>
????????<set?name="categories"?inverse="true">
????????????<key>
????????????????<column?name="DepartmentID"?not-null="true"?/>
????????????</key>
????????????<one-to-many?class="com.ngworld.bookstore.vo.Category"?/>
????????</set>
????</class>
</hibernate-mapping>
?
?
解决方法2:
当报这个错的时候,是因为我们的多表连接这里出现了问题,所以才会提示我们的session没有关闭,那么我们可以不在子表中加入lazy=”false”,如果要加的话是没办法的时候给加上,因为如果lazy=”false”的话,那么将会调用出所有的关联,那么我们就用左连接来解决。下面举个例子:
比如photo?表和user表关联
那么我们要通过photo表来调用user的关联,那么怎么来实现呢?
我们在我们的hibernate中来添加就可以了
String hql=”from photo p left join p.user”;
List list=getHibernateTemplate().find(hql);
这样来写hibernate就可以了,然后就可以通过photo来调用user了
当我们碰到如下这个问题的时候:
java.lang.NumberFormatException: For input string: "name"
我们可以去我们的action文件中输出些文件来看看具体是哪里出了问题:
public?ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)?throws?Exception {
???????//?TODO?Auto-generated method stub
???????List categoryList=categoryService.getCategoryList();
???????for (int i=0;i<categoryList.size();i++){
???????????System.out.println(categoryList.get(i).getClass());??
???????}
???????request.setAttribute("categoryList", categoryList);
???????return?new?ModelAndView("/category/categoryList.jsp");
????}
这个是我的action代码(controller),在这里我们可以用:
????System.out.println(categoryList.get(i).getClass());
来输出看看我们哪个类出了问题
我报这个错误的时候是因为的hql语句写错了,所以改完了后就好了
String hql=”from category”;
Return getHibernateTemplelate.find(hql);
这个是我改后的正确代码
我之前错误的代码是这个:
String hql="from Category p left join p.department order by p.id";
??????????????return getHibernateTemplate().find(hql);
所以报了上面的错误,具体的我们可以在输出的类中我们把我们错误给找到!
?
问题2:
当我们的控制台和页面上报出:
For input string:”XXXX”的时候,那么这个时候也许我们在我们sql语句中写了连接查询了,因为我们使用的是hibernate来封装对象的,所以我们都是对于对象去调用的,下面举个例子来说明一下吧:
String hql=”from Register r left join r.natrue n left join r.projectcategory p left join p.category”;
List list=getHibernateTemplate().find(hql);
然后我们把这个值传到我们的页面中去
比如我们把这个list返回到页面中去set的是”list”,那么我们写如下的页面代码:
${list.nature.name}//name是natrue的属性
如果这么去写的话,那么一定会到上面的for input string:”name”
那么我们怎么写才是正确的呢?
有2种方法:
(1)${list[0].nature.name}
(2)${list[1].name}
为什么这么写呢?因为我们使用的是连接查询,而且我们用的hibernate的对象查询,所以都是对于对象进行操作的
所以register?就是object[0]
????????Nature就是object[1]
????????Projectcategory就是object[2]
?????Category?就是object[3]
这下写的应该比较清晰了吧
?
这个问题是出在我们的hql语句当中的,其中查询的表是我们的pojo文件的名字而不是我们的表名字
例:
比如我们的pojo文件是CategoryPojo.java而我们的表的名字是category
如果我们的写下面的语句就会报上面的错误:
hql=”from category”
return getHibernateTemplelate.find(hql);
如果改成这个就不会有错误了
hql=”from CategoryPojo”
return getHibernateTemplelate.find(hql);
当我们的控制台返回下面的错误时:
严重: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'name' not found on type java.lang.String
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
????at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
????at javax.el.BeanELResolver.property(BeanELResolver.java:279)
????at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
????at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
?
这里的错误告诉我们是我们的el表达式中出了错误
我到我的jsp文件中去看了看
<c:forEach?items="categoryList"?var="category"?varStatus="status">
??<tr>
????<td><c:out?value="${status.index+1}"/></td>
????<td>${category.name}</td>
????<td>${category.department.name}</td>
????<td>${category.description }</td>
??</tr>
??</c:forEach>
?
看看我们的items这里,categoryList是我们request的一个参数,这里应该用items=${?categoryList?}?用${}把我们的参数引起来,这个是jstl的语法,我们这样给改了之后,错误就可以解决了!
?
当我们的控制台报以下的错误的时候:
org.springframework.orm.hibernate3.HibernateSystemException: not-null property references a null or transient value: com.ngworld.bookstore.vo.News.newskinds; nested exception is?org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ngworld.bookstore.vo.News.newskinds
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ngworld.bookstore.vo.News.newskinds
这是因为我的实现文件中所获取的都是id而不是我们newskinds表中的newskindId,而在我们的配置文件中,我们的设置是这样的:
<id?name="newsKindId"?type="java.lang.Integer">
????????????<column?name="NewsKindId"?/>
????????????<generator?class="increment"?/>
????????</id>
?
这里的id指向的是我们的newsKindId,而不是我们的id,但是在我们提交的时候,newsKindId?的值为空值,而我们的hbm文件中这里的设置是非空的,所以就在我们的控制台中出现了not-null这个错误。
所以我们应该把这里改成id,这个问题就解决了,改写的方法如下:
<id?name="id"?type="java.lang.Integer">
????????????<column?name="NewsKindId"?/>
????????????<generator?class="increment"?/>
????????</id>
?
这里我们改完了后,我们还要把我们相应的POJO文件中的对应的newsKindId的属性给删掉,还有对应的set和get方法
这样我们的这个问题就相应的解决了。
?
当这个问题解决了之后我们在启动程序之后,我们会抛出下面的错误:
2008-09-03 15:18:22,187 ERROR [com.ngworld.bookstore.controller.news.NewsCreateController] - <org.springframework.orm.hibernate3.HibernateSystemException: identifier of an instance of com.ngworld.bookstore.vo.News altered from 9 to 9; nested exception isorg.hibernate.HibernateException: identifier of an instance of com.ngworld.bookstore.vo.News altered from 9 to 9>
?
这个错误是因为我们的hbm文件中的类型和我们的vo包中的公用类中的BaseVo类的数据类型不一致我们的BaseVo类中的数据类型是Long型的,但是我们的配置文件中的确是integer型的,这个主要是我们在逆向工程中所生成的,所以我们这里要把我们的配置文件中的数据类型给改成和我们的BaseVo中的类型是一样的。下面是我们的修改文件:
这是我们的news.hbm.xml文件:
<class?name="com.ngworld.bookstore.vo.News"?table="news">
????????<id?name="id"?type="java.lang.Integer">
????????????<column?name="NewsId"?/>
????????????<generator?class="increment"?/>
????????</id>
?
这里的id的类型是java.lang.Integer的,而我们的BaseVo中的id是Long类型的,所以我们要把我们的hbm文件的id的类型也转换成我们的java.lang.Long类型这样就可以解决我们的问题了。
?
?
java.lang.NullPointerException
at
com.ngworld.bookstore.controller.news.NewsUpdateController.formBackingObject(NewsUpdateController.java:34)
?
当报这个错误的时候是因为你的程序中出现了空指针,所以出了问题,报的错误中提示我们说NewsUpdateController.java:34出现了问题,所以我们找到对应的语句,我在newsUpdateController.java中的第34行的语句的内容如下:
List newskinds= newskindsService.getNewskindsList();
??控制台提示我们说这行语句出了问题,那么我们对这句进行分析,这句是newskinds表的对象,那么这个对象出现了空指针,就意味着我们这个对象没有没注入,我的Controller的文件中已经注入了newskindsService这个对象,但是在我的servlet.xml配置文件中没有将这个对象给注入进去,所以这里报了空指针,所以我们要在我们的配置文件中把我们的对象给注入进去,如:
<propert?name="newskindsService">
<ref?bean="newskindsService"/></property>
这样这个问题就解决了。
?
?
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER): Turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition.
当报这个错误的时候,那是因为我们的service接口中的方法与我们在dao.xml文件中的事务处理的名字不一致,所以会报这个错
<property?name="transactionAttributes">
????????????<props>
????????????????<prop?key="save*">PROPAGATION_REQUIRED,-Exception</prop>
????????????????<prop?key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
????????????????<prop?key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
????????????????<prop?key="update*">PROPAGATION_REQUIRED,-Exception</prop>
????????????????<prop?key="*">PROPAGATION_REQUIRED,readOnly</prop>
????????????</props>
????</property>
我们的实现方法中的名字一定要与上面我们定义的这个名字要保持一致,否则系统会找不到我们的方法。
比如我的那个方法的名字定义是这样的
Pubic boolean delNews()throws Exception;
这样定义方法,当我们运行程序的时候会使我们的系统找不到remove,这样我们就需要把我们的service接口中的方法给改成下面这样:
Public Boolean removeNews()throws Exception;
这样,我们方法该成这样后就和我们的配置文件中的key=”remove”就一样了,这样系统就可以找到这个方法了,我们就可以进行删除修改了。
?
当我们的控制台报下面的错误:
line 1:49: unexpected token: null
????at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:2813)
????at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:2687)
????at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2407)
。。。。。。。
当抛出上面的错误的时候,是因为我们的变量有空值,所以我们把值给重新赋上就可以了,我的错误是解决是下面的问题:
这里是页面中的隐藏域categoryId
<input?type="hidden"?name="categoryId"?/>'>
这里是从Controller的文件:
String id=request.getParameter("categoryId");
???????Category?category=categoryService.getCategoryById(id);
这里返回categoryId,但是因为页面中的这里只是定义了而没有给予赋值所以这里的值是空的,所以抛出上面的错误。
解决方法如下:
<input?type="hidden"?name="categoryId"?value='<c:out?value="${categoryList.id}"/>'>
后面加上value='<c:out?value="${categoryList.id}"/>'把id的值传给categoryId这样就不会报null这个错误了。
?
在java中如果比较2个字符串是否一致,要用equals()不要用“==“,下面举个例子:
String a=”111”;
String b=new String (a);
System.out.println(a.equals(b));
System.out.println(a==b);
?
执行后返回的结果为:
True
False
?equals()是用来比较字符串是否相等的
?而“==”是运算符比较两个对象引用的
这个就是equals和==之间的区别
?
?
<img src=”../image/1.jpg”/>这样可以达到显示图片的操作,用的是相对地址,但是在后期的移植中还是不好控制的,所以我们最好用根路径按理进行相对地址的调用,也就是这样/image/1.jpg,但是如果这样我们就没有办法来进行相对了,那么我们就用jstl中的URL标签
<img src=”<c:url value=”/image/1.jpg”/>”/>
这样我们就可以进行相对地址的调用了
在执行页面操作的时候,我们会发现源文件中是这样来显示的
<img src=”项目名/image/1.jpg”/>这样就可以显示图片了
?
?
当我们点击表单中的提交后页面没有反映,然后我们在我们的Controller里面设置了断点,一看根本就没有进入我们的onSubmit的方法,那么这时我们怎么解决呢?
这个问题出在了我们的显示页面上,一般都是数据类型不正确,提交后才会没有反映,比如页面的数据类型是String?类型,但是库里却是Double类型,那么这样当然是不能把数据存到库中的,所以我们这时要用实验发来测试,看看在我们的页面中是哪个地方出现了问题,然后针对这个表单项对应的Form.java中的属性,再在controller里面将类型转换后问题可以解决。
?
?
?
在实现上传文件的时候,我们在配置文件中的path(也就是我们存文件的路径),这里一定要设置成你tomcat的项目下的路径,比如:
???????<property?name="path">
<value>C:\apache-tomcat-6.0.14\apache-tomcat-6.0.14\webapps\bookstoremanage\image\</value>
???????</property>
????这里就是我们tomcat下存放文件的路径,这样设置就不会有错了。
?
?
当我们在更新信息时,抛出这个错误:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
这是因为我们的SimpleFormController接口中的onSubmit()这个方法中没有request我们的id,所以存的时候因为找不到id所以抛错了。
在我们方法中加入加粗红色部分就可以了。
?
protected?ModelAndView onSubmit(HttpServletRequest request,
???????????HttpServletResponse response, Object command, BindException errors)
???????????throws?Exception {
???????PublisherForm form=(PublisherForm) command;
???????String id=request.getParameter("publisherId");
???????Publisher publisher=publisherService.getPublisherById(id);
???????publisher.setName(form.getPublisherName());
???????String message="操作成功";
???????try{
???????????publisherService.updatePublisher(publisher);
???????}catch(Exception ex){
???????????logger.error(ex);
???????????message="操作失败";
???????}
???????return?new?ModelAndView(getSuccessView(),"message",message);
????}
?
?
public?List getNewsKindsFindList(String newsKindsName) {
????????String hql="from Newskinds??where newsKindName like :newsKindsName";
????????List list=getHibernateTemplate().findByNamedParam(hql,?"newsKindsName","%"+newsKindsName+"%");
????????return?list;
????}
?
?
这里的newsKindsName是我传进来的参数,传进来的参数需要用冒号在前面来标识,比如“:newsKindsName”这个就是传进来的参数
String hql="from Newskinds??where newsKindName like :newsKindsName";
List list=getHibernateTemplate().findByNamedParam(hql,?"newsKindsName","%"+newsKindsName+"%");
第一个hql是我们传入的hql语句,”newsKindsName”是我们的形参,也就是我们冒号后面标识的,最后的是我们库里的参数
?
这里的%是用来模糊查询的,下面来具体说下这个:
·??'ABC%':?所有以?'ABC'?起头的字串。举例来说,'ABCD'?和?'ABCABC'?都符合这个套式。
·??'%XYZ':?所有以?'XYZ'?结尾的字串。举例来说,'WXYZ'?和?'ZZXYZ'?都符合这个套式。
·??'%AN%':?所有含有?'AN'?这个套式的字串。举例来说,?'LOS ANGELES'?和?'SAN FRANCISCO'?都符合这个套式。
?
?
?
在jsp?页面中不要用javaScript的关键字,还有不要用xxxxForm.java文件中的名字,这2个名字不要冲突
下面来举个例子:
<script?language="javaScript">
????function?todelete(url,id)
????{
????frm.newsKindsId.value=id;
????frm.action=url;
????if(confirm('确认要删除吗?'))
????frm.submit();
????}
</script>
<body>
<form?name="frm"??method="post"?action="newskindsfind.do">
<input?type="hidden"?name="newsKindsId">
<table?width="75%"?border="1"?align="center"?cellspacing="0"?bordercolor="#FF00FF">
??<tr?align="center"?bgcolor="#99FF00">
????<td?colspan="3"><font?face="楷体_GB2312">新闻分类管理</font></td>
??</tr>
??<tr>
????<td?colspan="3">
????????<input?type="text"?name="newskindName"/>
???????<input?type="submit"?name="submit1"??value="提交"/>??
???????</td>
??</tr>
?
上面这个是我的jsp中的部分代码,通过这段代码来解决我们的问题。
在我们的js中有这么段语句frm.submit(),这个里面用到了submit()这个方法,而且这个是js中的关键字,所以在我们的页面中不要起与submit一样的名字,如果起了会出冲突,js会报错误。
还有就是我们的<input?type="hidden"?name="newsKindsId">
但是不仅仅是这个隐藏域,包括一些与我们的XXXXForm.java里面的名字无关的表单项,避开里面的名字,不要起与xxxxForm.java中相同的名字,否则这样代码会有冲突,程序会出问题。
?
?
在用fn标签时比如在jsp页面上添加这条语句
<%@?taglib?prefix="fn"?uri="http://java.sun.com/jsp/jstl/functions"?%>
?
?
添加这条语句后就可以用fn标签了,下面介绍下fn:contains和fn:containslgnoreCase的用法
?f n:contains这个是用来判断一个字符串是否有指定的子串(区分大小写),函数有2个参数调用方法如下:
${fn:contains(string,subString)}返回值数据类型:boolean
?
${ fn:containslgnoreCase(string,substring)}这个用法与fn:contains一样,只是这个不区分大小写,下面来举个例子:
<c:if?test="${fn:contains(abc,'a')}">
<c:out value=”test”/>
</c:if>
执行这段代码后,在页面会输出“true”
如果想在EL中使用取反,则这么用
${!(El语句)},下面举个例子:
<c:if?test="${!(fn:contains(abc,'a'))}">
<c:out value=”test”/>
</c:if>
执行这个页面后会返回false,因为这个EL中使用了取反。
?
当我们使用<img src=””/>来添加图片的时候,当我们的src为空时,页面会显示一个红叉子,那么我们就用onError这个标签来解决
举个例子:
<img src=”” onError=”1.jpg”/>
当src为空时,则会显示1.jpg这个图片。
?
?
当你的控制台报出table(表名) is not mapped.的错误的时候,是因为在你的hibernate的实现类中的hql语句出现了问题,一般都是表名字那里出现了问题,这里的表的名字是我们的映射文件的名字,而非库里表的名字,这点必须记住。
举个例子:
String hql=”from publisher”;
假定我们的影射文件的名字是Publisher
那么我们这里的hql这里的查询语句就有问题了,所以我们要把这里改过来
String hql=”from Publisher”;
这样就对了,出现这个错误的时候,往往都是我们的查询的表名字这里出现了问题,那么我们就去hibernate实现类中去找我们的表名,看看错误在那里改过来就可以了
?
当控制台报这个错误的时候javax.el.PropertyNotFoundException: Property 'loginName' not found on type java.lang.String,解决方法如下:
问题出在了我们的EL语句中,如:
??<c:forEach?items="photoList"?var="list"?varStatus="status">
???……..
</c:forEach>
如果我们的EL语句这么写的时候,那么控制台则会报上述的错误,我中间的内容给省略了,如果仔细的话,那么我们会看到在items这里是有问题,这里的正确写法应该是items=”${photoList}”,这么改完了后就不会报错了
正确写法如下:
<c:forEach?items="${photoList}"?var="list"?varStatus="status">
???……..
</c:forEach>
?
?
?
如果在Manager中调用DAO的方法时出现了类型不正确的错误时,那么是我们的pojo的文件中没有继承BaseVo这个包,然后我们在我们的pojo这个包中继承上我们的BaseVo这个包就可以了,下面举个例子:
public?boolean?saveCustomer(Customer?customer)?throws?Exception {
???????return?customerDao.saveObject(customer);
????}
这个是我们的Manager包中的saveCustomer(Customer?customer)?这个方法当我们的方法中注入了customer时,如果返回的值出现了错误,那么代表我们的pojo的文件这里没有继承BaseVo的包,那么我们这里继承上这个包就可以了,下面举个例子:
public class Customer extends com.ngworld.bookstore.vo.BaseVo implements java.io.Serializable {
……………….
}
当我们没有继承extends com.ngworld.bookstore.vo.BaseVo这个包的时候会出现上面问题,继承后问题会解决。
?
在我们执行循环的时候,那么我们如何跳出循环呢,那么我们就使用break语句
下面举个例子:
?for(int i=0;i<5;i++){
if(i==3){
System.out.println(“i=”+i+”----”+”break”);
break;
}
}
?
将字符串转换成整型,下面举个例子:
String i=”1111”;
int??i1= Integer.parseInt(i);
这样i1就将i转换成整型了,如果要转换长整型或者浮点类型类似,举个例子
Long.parseLong();
Double.parseDouble();
其他类似,只要把类型对象加在前面后面那里换成对象的名字就可以了。
?
将数值类型转换为字符串类型:
Integer id=1;
String i=Integer.toString(id);
这样就将一个整型转换为字符串类型了
其他数值类型同上面的语法,举个例子:
Long.toString()
Double.toString()
…….
?
在js中调用action,例子如下:
function find(){
?????frm.action=”find.do”;
?????frm.submit();
}
?
Body中调用方法如下:
<input type=”button” name=”find” onClick=”return(find());”/>
?
?
?
?
在sql中要查询null的值就要is null,这样就可以查询了,下面举个例子:
Select * from book??b where b.name is null
这样运行后就可以查到表中为null的值了。
?
?
下面举2个例子:
例子1:
hql=”from book b where b.name=: (有空格)name”;
return getHibernateTemplate().find(hql);
在调用hibernte方法的时候,由于有空格,所以sql的语法就不对了,所以会报空指针的错误。所以我们要去掉空格后,我们传的参数就会正确的被查询出来,下面举个正确的例子:
hql=”from book b where b.name=: (无空格)name”;
return getHibernateTemplate().find(hql);
这样后就可以正确的查询到我们所需要的值了
?
?
比如:
<input type=”hidden” name=”id”/>
这样返回到controller中的id就是没有值的,所以我们这里要给id定义上value这样我们的id就有值了,就可以进行update的操作了,下面正确的写法为:
<input type=”hidden” name=”id” value=”${list.id}”/>
?
比如我们的book?和category是关联表,category的id是我们book表的外键,在我们的映射中category是我们book类的一个对象,比如private Category category;这样我们进行表的关联的操作的时候,会报出<could not initialize proxy - the owning Session was closed>这个session未关闭的错误,所以我们要针对指定的字段来把我们的hibernate的session?给初始化一遍。
比如我们要调用我们的category,而我们的category是我们的book表的对象,所以在我们要在我们被调用方法中调用我们的category的对象的方法中,我们要加上句初始化session的方法,那么我们在我们的方法中这样来加进我们的方法。
方法体:
Book book=bookDao.getBookByCategoryId(long categoryId);
Hibernate.initialize(book.getCategory());
???????return?book;
我们在加上这句Hibernate.initialize(book.getCategory());
后就可以初始化我们的session了。然后我们需要在我们的程序前面来引入一个包
import?org.hibernate.Hibernate;
引入这个包后,我们就可以使用Hibernate的对象了。
?
如果控制台报以下的错误时:
org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of com.ecoinfo.website.vo.News.setHtmlstatus
?
在错误中提示了我们在setHtmlstatus方法中set我们的htmlstatus的字段时抛出了错误,所以先判断htmlstatus这个字段出现了问题。所以我们要找我们的pojo的映射文件和我们的htm.xml的配置文件,所以我们看一下我们的这2个文件中的htmlstatus这个字段是怎么来写的。结果我发现在我的pojo映射文件中的当前字段和我的hmb配置文件中的字段的类型是不一样的,在pojo的文件中,我的htmlstatus这个字段的类型为int,而我的hbm中的类型为java.lang.Integer的,所以这里会报错,所以我们要把我们这个字段改成相对应的类型,比如都改成Integer或者都改成int,这样就不会报这个错误了。
?
当我们在jsp页面中调用我们的文本域的时候,
<FCK:editor?id="content"?basePath="../../FCKeditor/"?toolbarSet="Normal"?width="100%"height="270">????
??????????????????</FCK:editor>
就是上面的以fck标签来调用的,如果我们在页面头不加上
<%@?taglib?uri="http://fckeditor.net/tags-fckeditor"?prefix="FCK"?%>
这句的话,我们是无法显示下面文本域的
?
?
我们创建我们的servlet的时候,会发现我们会有2种常用的方法,那么就是doGet和doPost的方法,这2中方法都可以来写我们的方法主体,那么doGet和doPost这2种方法有什么具体的区别呢?
这个是根据我们页面中form的method来取决的,我们的method=”post”那么我们的方法主体就用doPost,如果我们的method=”get”那么我们的方法主体就用doGet
然后我们可以互相调用我们的doGet和doPost这样就不用考虑我们用那个方法主体了。
?
?
?
?
(1)如果可以显示页数,但是翻页后无法显示记录
这个问题一般出在你这个分页的页面是传过来参数,然后取的集合,这样你的页面的隐藏域中一般的value是没有个给赋值的,这时当你按翻页按钮的时候,你代用action的时候就会出现问题,因为你调用的集合没有传参,所以就不能取到值了。
下面举个正确的例子:
<input type=”hidden” name=”id” value=”${list.id}”/>
(2)如果你在点击翻页的时候,页面出现了js的错误,报的是不能调用submit()方法
当出现这个问题的时候,是因为在你的页面中有一个类型为submit的表单项的名字为submit了,所以这样在你的js中调用submit方法的时候就会出现冲突了,所以就会有问题了。
下面举个例子:
<input type=”submit” name=”submit” value=”提交”/>
这样类型和名字都是submit?,在js中用表单调用submit方法的时候一定会出冲突
比如:
Form1.submit();
所以我们要把我们这个名字不能定义为submit就不会出错误了,比如:
<input type=”submit” name=”submit1”?value=”提交”/>
?
?
(1)in的用法
select * from??attachment a where?a.id in (1,2,3)
上面的查询语句的意思是,查询attachment表中id是1,2,3的所有的记录
In的意思就是要查询的条件
(2)group by的用法
select g.begintime as time??,count(*) as num from groups g group by g.begintime HAVING time>'2008-11-07' and time<'2008-11-30'
上面的查询语句的意思是把groups表按照begintime来分组查询,然后查询begintime是在大于2008-11-07且小于2008-11-30之间的分组,然后计算出总和
这里要注意的是,在用group by的时候,如果要进行条件查询的时候,一定要用having来进行条件查询,而不能用where。
还有就是在查询条件的时候最好给加上别名,这样方面调用,比如
select g.begintime as time??,count(*) as num from
这里就把这2个查询的字段都加上了别名,这样调用起来就方便多了。
?
?
?
?
当控制台报这个错误的时候:
?
org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not insert: [com.ecoinfo.website.vo.Notice]; SQL [insert into notice (notice_title, notice_content) values (?, ?)]; Data truncation: Data too long for column 'notice_content' at row 1;
?
nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'notice_content' at row 1
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'notice_content' at row 1
?
报这个错误,提示我们记录无法插入,那么我们这里是哪里错了呢?
这个不是因为我们的数据的长度太长而无法插入,而是因为我们这里对应数据表中对应的charset类型不支持中文,把我们库中的charset改成gbk,然后再把我们的collation的类型改成gbk_chinese_ci这个类型的就可以了,这样就可以支持中文编码了,然后也就不会出现不能插入的问题了,这个问题是出在mysql中,在别的数据库中不知道有没有这样的问题。
?
?
${fn:substring(“要截取的字符串”,beginIndex,lastIndex)}
在EL中用截取字符串的语句,需要在jsp页面头那里加上下面这句话来引用fn标签
<%@?taglib?prefix="fn"?uri="http://java.sun.com/jsp/jstl/functions"?%>
?
?
当控制台抛出下面错误的时候:
java.lang.IllegalArgumentException: Illegal group reference
我们的抛出异常中抛出了上述的异常时,是因为我们替换的内容中有$了,这里我们把我们的$给加上\\就可以解决这个问题了,下面举个例子:
String test="11aa11";
test.replaceAll("a","\\$");
这样就可以解决这个问题了
替换内容中不能出现$在被替换内容中也不能出现$,解决方法相同,都是加上\\
举个例子:
String test="11$aa11";
test.replaceAll("\\$","a");
先从页面中返回值,然后再将值传回页面
举个例子:
这个语句是在formBacking方法中来实现的:
String content=request.getParameter("content");??request.setAttribute("content", content);
?
在我们的表单中有提交方式,method可以有get和post这2中方式,但是这2种方式有什么区别呢?
Get提交的是部分的问题,是提交少量的文字信息,而post提交的是全部信息
?
问题:
在tomcat下直接下载*.rar?一般浏览器会默认作为“文本”格式直接在浏览器打开。就出现一大堆的乱码。
而我们要求的是要把rar文件下载到本地。
最简单的办法就是让用户点击[右键]另存,当然这样不好。
或者把rar文件的格式改成zip在tomcat就能正常下载了。
前面两种方法都有投机取巧之嫌,我们可以通过改%TOMCAT-HOME%/conf/web.xml,的mime-mapping来实现
在原来的mime-mapping处加上rar的默认下载方式:
xml?代码
?
然后重启tomcat,注意有可以IE缓存的原因,还会按文本格式打开。要多刷几次噢。
?
?
在sql的语句中,我们有时候会遇到多字段进行排序,那么多字段进行排序是怎么来排序呢?下面我们来举个例子:
select * from news n order by n.commend.asc,n.pubdate desc
这样就可以了。
?
其实也就是在我们的order by后面写上条件,有几个字段来排序,我们中间用逗号给阁开就行了,但是order by只能有一个
?
Select?表名?from order by?字段?排序方式,字段?排序方式,字段?排序方式……
?
?
如果在你的页面中,你的字符超出了你的表格的宽度会隐藏看不到后面的字,所以需要去换行去解决这个问题,那么我们怎么去解决这个问题呢?
我们在我们的页面中的需要换行的地方加上这个语句:
style="word-break:break-all"就可以实现自动换行了
下面举个例子:
<td??style="word-break:break-all"></td>
这样这个<td>单元格中就可以实现自动换行了
如果这个加在<tr><body><table>中加上后,那么这些也会起到自动换行的作用
?
当你的控制台抛出下面的错误的时候:
Error setting property values; nested exception isorg.springframework.beans.PropertyAccessExceptionsException:PropertyAccessExceptionsException?(1 errors); nested propertyAccessExceptions are: [org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy7] to required type [com.ecoinfo.eiaapproval.service.RegisterService] for property 'registerService']
当报这个问题的时候,很明显是我们的配置文件的那里出现了问题,那么我们这里具体哪里出现了问题呢?
上面告诉我们了,是我们的service这里出现了错误,那么我们去找我们的service这里配置看看哪里出现了问题:
我的这个问题出现在:
????<bean?id="registerTarget"?class="com.ecoinfo.eiaapproval.manager.RegisterManager">
????????<property?name="registerDao">
????????????<ref?bean="registerDao"/>
????????</property>
????</bean>
????<bean?id="registerService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"parent="txProxyTemplate">
????????<property?name="target">
????????????<ref?bean="registerDao"/>
//看这里,应该引入的是我们上面的那个registerTarget,但是这里却引入了registerDao这样当然是有问题的,所以把这里改过来就可以了。
????????</property>
????</bean>
?
当我们部署的时候,我们的部署的控制那里如果报下面的错误的时候:
Deployment failure on Tomcat??6.x. Could not copy all resources to C:\file\tomcat\webapps\eiaapproval. If a file is locked, you can wait until the lock times out to redeploy, or stop the server and redeploy, or manually remove the deployment at C:\file\tomcat\webapps\eiaapproval
?
这是因为在我们的web-inf/lib的里面有重复的.jar的包了,所以我们这里会有冲突,当我们把包删了之后问题就会解决了。
?
当控制台报下面错误的时候:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'register0_.isAcceptSecretary' in 'field list'
?
如果报这个错误的时候是因为我们的hbm文件中的字段和我们数据库中表的字段不匹配,所以才会出现这种问题,所以我们要针对报的错误的时候显示的字段的来判断我们是哪个字段出现了问题,然后去解决。
?
如果在显示页中出现了乱码,可能是我们数据库中的解码方式出现了问题,我们改变解码方式就可以了。Mysql中把charset改成gbk,把collation改成gbk_chinese_ci
?
?
给下拉菜单设置大小只需在里面加上style="{width:180px}"就可以设置它的宽度了,下面举个例子:
<select name=”aaa” style="{width:180px}">
<option value=”1”>aaaa</option>
</select>
?
String unitNum=new String(request.getParameter(“unitNum”).getBytes(“iso-8859-1”)
,"utf-8");
这样就解决了
?
1._blank?????? <a href="document.html" target="_blank">my document</a>
????浏览器会另开一个新窗口显示document.html文档??
2._parent????? <a href="document.html" target="_parent">my document</a>
????指向父frameset文档???
3._self?????????? <a href="document.html" target="_self">my document</a>
????把文档调入当前页框??
4._top?????????? <a href="document.html" target="_top">my document</a>
????去掉所有页框并用document.html取代frameset文档????
小技巧1:使别人的页框不能引用你的网页????????在文件头加:<base target="_top">????
小技巧2:在当前页打开连接或做刷新,提交到当前页在文件头加:<base target="_self">
?
response.sendRedirect(URL)这个方法是重新定向到指定的url,这个方法的好处就是重新定向后等于重新连接了一回URL,所以无论如何刷新页面我们的URL都会是重新定向后的URL
举个例子:
如果我们在列表页进行caozuo.html" target="_blank">删除操作,然后我们return回我们的list页,但是return后页面跳转过去了,但是我们的url仍然是我们的删除方法的url,如果刷新当前的url则执行的是删除的url而不是我们当前页面的url,如果用response.sendRedirect(URL)方法,那么我们的url就会是重新定向后的url而不会是删除方法的url,这样就不会出现错误了。
?
form1.submit003.style.display=’’;在本行显示
如果
form1.submit003.style.display='block”';
则submit003会换行显示
?
?
Function a(id,url){
}
?
<a href=’#’ onClick=”a(‘${id}’,’${projectName}’);”>aaa</a>
?
这里在调用js的时候最好用引号把我们需要传递的参数给引起来,这样就不会报错了
?
Select * from?表?where month(字段)=‘月’
Select * from?表?where year(字段)=‘年’
Select * from?表?where day(字段)=‘日’
举个例子:
select c.restdate from configdate c where month(c.restdate)='04'
这个查询的是configdate这个表中的restdate字段的所有4月的记录
select c.restdate from configdate c where year(c.restdate)='2009'
这个查询的是configdate这个表中的restdate字段的所有2009年的记录
select c.restdate from configdate c where day(c.restdate)='01'
这个查询的是configdate这个表中的restdate字段的所有1号的记录
?
Access denied for user 'root'@'localhost' (using password: YES)
如果报这个错误的时候,我们应该看看我们的连接池的user和我们的password是否一致
?
如果你的这个表用有一个表的几个字段对别的表有引用的话,那么最好使用关联,不要直接用对象调用,那样会出现问题
下面举个例子:
String hql=”from Register r left join r.isEia iea left join r.isAccept iat where iea.domainValue=1105?or iat.domainValue=1701”
如果语句这么拼的话就不会出现问题
如果这么拼的话
String hql=”from Register r where r.isEia.domainValue=1105?or r.iat.domainValue=1701”
如果这么拼sql的话那么一般只执行后面的条件,虽然不知道为什么,但是还是写上面的那样的关联查询比较好,因为在库里面的查询分析器中也都是需要多表关联来查询的,也不是对象来进行查询的。
?
下面再说一个在多表查询中去除重复记录的语法
Select distinct r.projectName from register r,domainValue dv1 where r.isEia=dv1.id and dv1.domainvalue=1105
?
如果没有distinct的话那么会有重复记录,加上它就没有了
?
Window-reset perspective
点这个就恢复了
?
当控制台报这个错误的时候:
org.springframework.orm.hibernate3.HibernateSystemException: More than one row with the given identifier was found: 1473, for class: com.ecoinfo.eiaapproval.vo.Register; nested exception is?org.hibernate.HibernateException: More than one row with the given identifier was found: 1473, for class: com.ecoinfo.eiaapproval.vo.Register
?
当报这个说主键有多个的时候,那么在我们库中就是有了重复记录,一般报这个错误的时候,我们都是对于单个id进行单条记录查询,所以在这个时候,如果出现了个重复id的话,那么我们这里就会出现这个错误,解决方法就是我们把这个重复的记录给删掉就可以解决问题了
?
//这个是清除2边空格的方法
String.prototype.Trim = function()
{
??? return this.replace(/(^\s*)|(\s*$)/g, "");
}
//这个是清除左空格的方法
String.prototype.LTrim =function()
{
??? return this.replace(/(^\s*)/g, "");
}
?
?
?
//这个是清除右空格的方法
String.prototype.RTrim = function()
{
??? return this.replace(/(\s*$)/g, "");
}
//这个是清除所有空格的方法
??? String.prototype.clearAll=function()
{
?????? return?? this.replace(/\s/g,'');
}
?
在我们的javaScript中加入了这些方法
我们用的时候只需要直接调用这些方法就可以了
例子:
Alert(‘?? aaaa?? ’.clearAll());
文本框
Form1.projectName.value=form1.projectName.value.clearAll();
?
这样就可以清楚空格了。
?
?