1:
HashMap在new的时候就赋值初始化,哈哈,没做过吧,这样写:
Map hashMap = new HashMap(){
};
2
javax.persistence.PersistenceException: org.hibernate.PersistentObjectExceptio
org.hibernate.ejb.AbstractEntityManagerImp
(AbstractEntityManagerImp
在网上找了半天也没找到答案。
后来通过println找了原因,当我第二次插入用户的时候,还没有实例化到数据库就有了ID值,而且这个ID值是我第一次插入用户的ID,这是不正常,因为ID没有设置过,而且JPA默认的行为是只要指定了主键生成策略,主键就不能设置了,一旦不为空或者0就被认为是已经保存到了数据库中,一旦调用persist()方法就会抛出上面的异常。
为什么会还有第一次的插入用户的信息呢,原因就是我action的作用域设置错误了,我采用了默认单例的设置,对于Action来说必须采用prototype(每次调用创建一个对象)的作用域,修改方法是:在Action上就一个注解@Scope("prototype")
3:long转int
Long a = 1; int b = a.intValue();
4:问题不碰上永远不会去解决
File file=new File("c://a.jsp");
单独上面一句话是不会生成物理上的a.jsp文件的
如果你想生成的话请加上一句:
file.createNewFile();//return boolean
我不知道是不是要使用一下file才会生成物理文件(联想到android中的一个啥去了,必须执行一条语句,缓冲区中的数据才会输出),但是确实执行这句话后才会在路径下生成文件
注意的是,替代不是发生在原来的字符串中,而是会生成一个新的字符串,如果需要得到心的字符串才是替代后的字符串!!
i、replace方法
|
|
|
6今天将实现没发一贴生成新的jsp页面的功能实现了
获益良多,在昨晚睡觉的时候想到几个方法,但是今天给出了更好的方法!!
7:在实现一个action跳到另一个anction 的方法时候:
在同一个package下(即相同的namespace)
不同的package
<action name="loginAction" class="cn.huanglei_jmr.action.LoginAction" method="login">
resultd的几种类型:
action的默认结果类型是dispatcher,而action之间发送请求是不能直接用该结果类型的。一般来说,可选的结果有redirect、redirect-action、chain。前两种都是属于页面跳转,也就是说,发送请求以后,地址栏的地址会刷新为被请求的action的地址,而chain则不会更新地址。
redirect-action:“这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace. 这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式. 这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.”---webwork2的说法。
redirect:“调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置。HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用。”
简单说,两者的共同点是,地址栏会变化(都是转发),所有前一个action的请求参数都会丢失,当然也包括action的属性值也会丢失。路径写法稍有不同,redirect-action请求下一个action时,不带后缀.action,而redirect和普通URL写法一致。redirect-action支持param来附加请求参数,但是这往往会导致ServletActionRedirectRes
chain:相当于是forward,首先表现为地址栏不会改变,类似dispatcher,同时,它的特点是能够在多个action中共享表单传递过来的数据,同时,按照action链的顺序,相关action的属性值也会传递下去,这表示在最后的视图页,你可以得到前面所有action的属性值(如果有get方法的话)。对于多个action具有相同属性值的话,后续action会先使用前面的action的数据来进行赋值,然后再进行逻辑处理并传递下去。
看起来是很完美,可是却有很大的问题。如果后面的action需要调用前面action的属性值,他得保证具有同样的属性值,否则你无法接收到前面action的值。他无法像redirect-action一样通过附加参数获取,他不支持xxx?a=x&b=y的形式。这将导致很大的耦合性和无效参数的泛滥,无法通过配置文件传递参数也很麻烦。
另外,很困扰的一点就是,如果在action链靠前的action方法内出现错误(如action的hasError方法返回true)或者发生异常,他就会强迫你定义input结果,包括后面的action也要定义,否则就会报错。而实际上,即使符合了以上条件,他仍不会执行后面的action,而是直接跳到后面的action的input视图。除非发生错误的action返回input,并且type为“chain”,并且后一个action的方法必须为input,否则后续方法不会执行,而直接定位到了最后的物理视图。
这让我觉得chain的适用范围变的十分窄,据说webwork2已经不提倡使用chain,这个没考证过。
为什么在我的地址栏中出现的都是action的路径(即后缀都是action的名字,而不是我的jsp呢)这个问题我要解决,如果解决应该能直接解决我想要跳到第N页这个问题
8:unicode-->汉字和汉字---》unicode
网上都是说的后一种,前一种说是用split对/u进行划分后再转,这里我提供一一代吗
@Test
JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return cod
INFO: Stopping Coyote AJP/1.3 on ajp-8009
解决的办法是,端口被占用,任务管理器停止javaw进程,再次打开即好!
9 有事css样式的问题,在IE下表单可以居中显示,但是在火狐下却打死也不居中,不管是
body:{text-align:center}
table:{text-align:center}
form:{text-align:center}可能格式有误,但是是这个意思
最后在html代码中写<table border="1"
问题是解决可,但是不知道原理,哪位大神能解决,希望给留言,感激不尽,继续写bbs
另摘取一段网上相识的问题写在这里,给网友帮助!表格嵌套布局图片在IE浏览器下正常,在火狐和chrome浏览器下图片不左右居中,在单元格内呈左对齐。解决方法:
不同的浏览器对DIV的支持不一个,目前最好的浏览器是Firefox.这里涉及到两个属性,一个是line-height,另一个是vertical-align。在IE里面,只需要line-height就可以实现这个效果,不过要想在firefox也实现这样的效果,必须用到vertical-align,而且这个属性一定要定义在image上面,而不是定义在div上。
代码如下:
<html>
<head>
</head>
<style>
.abc{
<body>
<table
</table>
</body>
</html>
10我在struts中使用了url过来后缀为.action的路径均用struts来处理,这个时候我在jsp页面中导入了
<%@ taglib uri="/struts-tags" prefix="s"%>标签,这个时候出现错误:
The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter.
原来我的路径是直接访问后缀为.jsp的,所以没有经过上面的struts,当然也不能使用标签了,因为是无效的!!解决办法The Struts dispatcher cannot be found. This is usually..
11 使用了struts上传功能,还是未解决CKeditor的上传问题,但是已经非常接近了,在使用struts2上传的时候遇到上传的文件名为中文的时候出现的乱码问题,解决的办法是
在src下写一个struts.properties文件:这个文件是自行加载的,没有在哪个地方进行手工的引入
struts.locale=zh_CN
struts.i18n.encoding=UTF-8
这里注意上传页面的编码也必须为utf-8,如果为gbk那么相应的都要改为gbk,这样也行,依次类推到gb1312,
然后再struts.xml中<constant name="struts.i18n.encoding" value="UTF-8" />
详解请查看我的博http://blog.sina.com.cn/s/blog_b98d87830101dgwt.html
然后再上传的时候注意上传表单的:
尤其注意upload,在对应action中可以接收于此对应的三个属性:
private File upload;// 封装页面文件域对应的文件内容 type="file"
一定注意了!!!!!!!!!!!!
在input file中我没知道直接可以拿到;但是在cke中,是通过:
FileItemFactory factory = new DiskFileItemFactory();//factory=org.apache.commons.fileupload.disk.DiskFileItemFactory@a48f13
//
//
String fileNameLong = uplFile.getName();//文件名得到
在struts中我想通过xml中param传递文件后缀名,但是接收的时候显示空指针,我才知道这样是行不通的,allowTypes是直接可以过滤掉不允许的类型的,而不需要我在action中进行接收判断,那么我该怎么做呢?两种方法,一个是使用allowTypes在action中不进行判断;第二个是将这个后缀名信息写在配置文件中吧然后读取配置文件!
最后解决的还是使用servlet来实现的,因为在action是使用List items = upload.parseRequest(request);解析request得不到items,长度永远为零!如果哪位大神知道缘由,请交流,感激不尽!!
12:<action name="download" class="com.unmi.action.DownloadAction">
</action>
这个stream是什么时候用,在我们请求一个action时候,需要返回的是一个流,就用这个(一般我们都是跳转到一个页面),我写的两个例子,一个是点击验证码图片然后生成验证码,另一个是点击上传文件的链接进行文件下载!!
13:6月25号,终于将帖子上传视频及视频的播放功能给实现了,接下来需要好好想想怎么利用这些视频开发一些新的功能(QQ的分享及下载,怎么联系到JW player中去!)
在写导入播放器代码的时候注意/"直接就可以代表双引号了,不用在此纠结!!
14将实验室的代码拷贝到自己的电脑上,部署是出现错误:
异常代码
严重: Exception starting filter struts2
Unable to load configuration. - Class: java.net.PlainSocketImpl
File: PlainSocketImpl.java
Method: connect
Line: 177 - java/net/PlainSocketImpl.java:177:-1
解决方法:
打开struts-core-x.x.x.jar中的struts-default.xml文件,该文件的头部,关于struts.xml声明复制到我们自己的struts.xml中,替换原来的声明!
OK!问题解决!
15 万恶的action,万恶的namespace啊!!今天又碰到一个神一样的问题:
在我的后台登陆系统中,当我我登陆使用的是action配置跳转的,这样:namespace="user"
<action name="managerLoginAction" class="cn.huanglei_jmr.action.ManagerLoginAction" method="login">
如果我的登陆用户名错误的话,那么使用action跳转到本页面,再来看看我的页面中导入的js和css
<script type="text/javascript" src="js/login.js"></script>
<link rel="stylesheet" type="text/css" href="/css/hljmr01.css"/>
这个时候真实导入这些样式的路径是:
http://localhost:8080/MyNet/user/css/hljmr01.css,我去啊,加了user命名空间,那么我的跳转虽然是页面成功,但是样式全没了,js也没了!!
到底我该如何处理使用action才能将地址栏显示为我的jsp页面尾椎的地址呢?这又是我在上面多次提到的问题,type能解决吗??这个问题到了非解决不可的地步了!!
16:6-30刚刚将页面做好,为了布局我使用了iframe,结果在融入到我的项目中的时候才发现,iframeset是由多个页面组成的,那么我这个混合页面中的数据是否能够共享呢?我觉得是不能的,至少我现在这样认为,当然我会解决这个问题的,但这时候才恍然大悟,难怪这么多网站都是用的div来布局,没人整这个东西!!但是走到这一步没办法了,我的计划是这样的,比如说登陆的话我会在top中取用户名来判断是否登陆,然后每个模块页面中的数据可以使单独的,比如说我要取帖子的内容的模块是不会和商品模块有关联的,这些还好,就是在域中的传递可能会出现麻烦!我到底是传给这个混合的网页还是传给某一个模块的页面呢!
且行且解决吧!!
iframe的一篇博客http://blog.sina.com.cn/s/blog_b98d87830101dsu4.html
16:在jsp页面中进行代码的编写,发现很多有趣的事情:
17:必须得写下这些知识点:
jquery的ajax:
<script type="text/javascript">
$(document).ready(function(){
});
</script>
action端:
lookNum="{"lookback":"+lookback+"}";//注意引号 {"lookback":'"+lookback+"'}返回的数据是:{"lookback":'31'}
我写的时候缺了上面的dataType于是导致不能进入success回调函数,还有返回的json数据格式很重要!!
据说必须是:{"key":value}---->value若是字符串必须是"abc",数字和boolean不需要
- .html():读取和修改一个元素的HTML内容,详情.html();如果选择的标签体内有htnl标签这个一起取到
- .text():读取和修改一个元素的文本内容,详情.text();这个只取其中文本
- .val():读取和修改一个表单元素的value字段值,详情.val()。
18:遇到一个超级无敌的瓶颈,在写回复模块的时候,想使用<s:interator,但是没有考虑到我的帖子都是直接jsp后缀就可以进行访问的。这个时候没有经过action的jsp是会出错的,就像我的帖子显示列表页面一样:
我现在能想到的解决方案是:
1:如果能找到请求action并能跳到当前页的方法是可以解决的,那么我将使用ajax的方法进行,return null是不可行的,而且我的帖子的名称是不定的肯定不能再struts.xml中进行配置
2:重写jsp页面当每次进行回复的时候,这个我没有找到在指定位置写入的方法write(byte[]
3:如果还没找到方法的话,我将使用最终的方法,先读出所有的字节然后进行string的替换,然后再写入,这种方是可行的!
但是在点击回复的那一刻我将怎么做?是action跳到这个页面,或者刷新页面?明天拭目以待!--2013-07-10
19:解决struts中的取值问题:
在jsp中,以前我取值都是放在域中使用EL表达式,当然ognl其实也是el转过来的,原理是这样的,所以使用el是没有错的,但是现在使用<%@taglib prefix="s" uri="/struts-tags"%>标签又不一样了,
像<s:if test="">test中怎么写的问题很是恼火,
下面完全总结出来了:
S标签中用#可以取出堆栈上下文中的存放的对象.
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息. %{#},这是JSP2.1最新规范中的语法,是Struts2为其解决兼容性问题而写成%{#}的
在域对象中使用%{#} 比如%{#session.user.userName} 将获得user对象的 userName属性值
%{}强调的是从你设定的root点取
%{}用于计算表达式
#通常强调从上下文取
%{#}仍然用于计算表达式,只不过操作元可以是变量
根据上面说的我实现了:
<s:if test="#session.username!='' && #session.username!=null">
欢迎您:${username }
<a href="#"><font size="-1" color="#000099" >个人中心</font></a> <a href="<%=path %>/content/hrefAction.action"><font size="-1" color="#000099" >发帖</font></a> <a href="#"><font size="-1" color="#000099" >消息</font></a></span>
</s:if>
<s:else>
<a href="<%=basePath %>user/forwardAction.action?name=login"><font size="-1" color="#000099" >登陆</font></a> <a href="<%=basePath %>user/forwardAction.action?name=register"><font size="-1" color="#000099" >注册</font></a>
</s:else>
还有:这个pageNo直接是action中的变量,上面username是放在session中的!
<s:if test="%{pageNo!=1}/>">
字符串N一定要用“”双引号包含,从test的包含则用单引号 ‘ ’,如果相反,则不能正确判断该属性是否与该字符串相等。
正确:
<s:if test='activityBean.searchForce=="N" '>
错误:
<s:if test="activityBean.searchForce=='N' ">
因为java是强类型语言,单引号表示char类型,只能赋给一个字符给char类型,
而双引号则表示String类型所以我的activityBean.searchForce属性是String类型,那么N必须要用双引号
/*******************************************
例如这个语句
要判断struts堆栈里systemSettingModel.settingValue 是否等于 "A"
写成 <s:if test="systemSettingModel.settingValue == 'A'">...</s:if> 是不对的。
这样A被认为是字符,而systemSettingModel.settingValue是单字符的字符串,不匹配
应写成 <s:if test='systemSettingModel.settingValue == "A"'>。。。 </s:if>
或 <s:if test="systemSettingModel.settingValue == "A"">... </s:if>
20 今天在转string为int的时候(作为order by value)
查到 order by cast(testId as int) desc;(sql+oracle支持)但是出错,在mysql中不能为int!换为SIGNED成功!更正:可以为integer!!!
mysql convert(value,type) cast(value as type)
今天看到Mysql的 Cast和Convert函数。发现这个还是与别的数据库有些区别的。
两者具体的语法如下:
Cast(value as type); Convert(value ,type);
type不是都可以滴,可以转换的type如下:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
21:在进行页面下拉框选择排序的时候,我最先使用了ajax进行请求action,然后调整list集合的顺序,但是ajax不会刷新页面,所以页面根本无反应,在:
function gosort(value){
<select οnchange="gosort(this.options[this.options.selectedIndex].value)" >
实现!!!
功能实现,但是出现一个小小的问题:我使用的是window.location,然后对这些选项而言,,如果我选择了回复数排序,页面刷新后以回复数排序这是正确的,但是下拉框的显示为时间倒序,因为这里刷新了吗,所以选项还是跟着回到默认第一个!要改正这个错误的话必须实现的是局部刷新,还是要ajax来实现,但是我这是一个页面,如果要改造的话显得麻烦,暂时这个就放在这里,看能否有另外的解决方式!
22:关于搜索的实现:
Query repeatClientQuery=querysession.createQuery(
"from ClientInfo as a "+"where a.client_name like
:name" );
repeatClientQuery.setParameter("name",clientname);
查询无结果.LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。LIKE '%en%' 将搜索在任何位置包含字母 en 的所有字符串
(如 Bennet、Green、McBadden)。
LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称
(如 Cheryl、Sheryl)。LIKE '[CK]ars[eo]n'
将搜索下列字符串:
Carsen、Karsen、Carson 和 Karson(如 Carson)。LIKE '[M-Z]inger'
将搜索以字符串 inger 结尾、以从M到Z的任何单个字母开头的所有名称如 。
LIKE 'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称
(如 MacFeather)。
直接写String sql = "from ClientInfo as a where a.client_name like '%"+ clientname+"%'");
Query repeatClientQuery=querysession.createQuery(sql);
成功.但是却不能查询中文,假如clientname是客户1名字的话,那么将查不到结构,
解决办法:1.用占位符:
Query query = session
.createQuery("select count(*)
from Privilege p where p.name like ?");
query.setString(0, "%" + name + "%");//
注意这里不能写成setString(0," '%" + name + "%' ";
否则查不出来结果,不能加‘单引号2.修改查询编译器:
Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器,
在Hibernate的配置文件中,hibernate.query.factory_class
属性用来选择查询翻译器。
(1)选择Hibernate3.0的查询翻译器:
hibernate.query.factory_class=
org.hibernate.hql.ast.ASTQueryTranslatorFactor
(2)选择Hibernate2.1的查询翻译器hibernate.query.factory_class=
org.hibernate.hql.classic.ClassicQueryTranslatorFa
为了使用3.0的批量更新和删除功能,只能选择
(1)否则不能解释批量更新的语句,当使用的时候出现了不支持条件输入中文的情况。
选择
(2)可以支持输入中文,但没法解释批量更新语句了。
--------------------------------------------------------------------------
下面是自己用的:
?Map<String, Object> params = new HashMap<String, Object>();
sb
.append("select distinct bo from FCusCustMBO bo, FBdcContractMBO contBO where bo.id=contBO.dealerId and contBO.dealerId is not null");
if (StringUtils.isNotBlank(customerName)) {
sb.append(" and bo.custname like :customerName");
params.put("customerName", "%" + customerName + "%");
}
23:ajax实现请求返回html,ajax获取html代码
<div
<div
<div
<tr
<tr
</div>
</div>
function(data){
alert($(data).find("#content").html());//获取<div
alert($("#content",
}
请求插入html代码:
你在网页中保留一个容器,如<div id="container"></div>,获得HTML后这样:
success:function(str){
$("#show").html(str);//插入
}
});
$("#container").html(HTMLContent);
或者用append(),appendTo(),prepend(),before(),after()之类的函数将其插入到现有的HTML中。
24:对bbs论坛的回复功能进行用户名是否为空的判断+对提交的回复内容是否为空进行判断
我这里是用js实现的:
<s:hidden id="userIdInSe" name="#session.username" ></s:hidden>//加一个hidden域
var id=document.getElementByIdx_x_x_x_x("userIdInSe").value;
if(id=='' ||id==null){
<%-- alert('您还没登陆,请先登陆回复!!!');
window.location.href ='<%=basePath %>user/forwardAction.action?name=login';
return; --%>
//id="backsubmit"
//alert(document.getElementByIdx_x_x_x_x('backcontent').disabled);
document.getElementByIdx_x_x_x_x('backsubmit').disabled = true;
//alert(document.getElementByIdx_x_x_x_x('backcontent').disabled);
document.getElementByIdx_x_x_x_x('backcontent').value="<font color='grey' >请先登录</font>";
};//测试通过
判断空的操作,据说网上有
var oEditor = CKEDITOR.instances.文本域的id值;
if(oEditor.getData()==""){alert("请填写您的回答内容!");return false;}
未测
24 Commons-FileUpload上传文件
我写的代码中,执行到:List items = upload.parseRequest(request);
System.out.println("items的长度="+items.size());
结果为长度为0,我使用的是struts2,据网上的代码都是struts1的,有说法
struts2过滤时,会改变reqeust的类型,由HttpServletRequest变成MultiPartRequestWrapper
所以parseRequest就返回了null
暂时还未能解决这个问题,我在ckeditor中写上传文件代码的时候使用的是servlet!!问题是出在这个地方是肯定的,这下面这个解决方案也是不行的,我本来就是*.action的!
在上传的过程中,当代码运行到List items = upload.parseRequest(request)这里时,发现items为空,检查程序后,没有问题,最后再网上看了一下原来是把web.xml中的
<filter>
改成
<filter>
问题就解决了
25页面加载后就执行想要的js代码,
1:$(document).ready(function () {}//强烈注意这个$是jquery的符号,所以这个js必须导入在jquery的后面,写在页面中的js是最后导入的:@:
2:不要jquery刻意这样写:<script language="javascript" for="window" event="onload">
和window.οnlοad=function()