BBS开发的笔记大全!!!

1:

HashMap在new的时候就赋值初始化,哈哈,没做过吧,这样写:

Map hashMap = new HashMap(){
            {
            put("A", "a");
            put("B", "b");
                     
};

2 在实体类中,构造函数不需要id值了,如果已经指定了id为自动生成策略,如果在设置的话就会出现error
 //javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.dalton.domain.User

 另外网友还提供了类似的错误,我觉得很有意义。可能会碰到:

  再用jpa+spring+struts2开发的是时候遇到一个问题(采用了注解的方式,xml配置的道理是一样的),当我在注册用户的时候,注册第一个用户没有问题,但注册第二个用户开始就会抛出一个异常:

 
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.dalton.domain.User

 

org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException

(AbstractEntityManagerImpl.java:614)
    org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        …………………………

在网上找了半天也没找到答案。

后来通过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中的一个啥去了,必须执行一条语句,缓冲区中的数据才会输出),但是确实执行这句话后才会在路径下生成文件

 5:java中国的替代指定字符串:

注意的是,替代不是发生在原来的字符串中,而是会生成一个新的字符串,如果需要得到心的字符串才是替代后的字符串!!

i、replace方法

    该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变。例如:

 

    String s = “abcat”;

    String s1 = s.replace(‘a’,‘1’);

    该代码的作用是将字符串s中所有的字符a替换成字符1,生成的新字符串s1的值是“1bc1t”,而字符串s的内容不发生改变。

    如果需要将字符串中某个指定的字符串替换为其它字符串,则可以使用replaceAll方法,例如:

 

    String s = “abatbac”;

    String s1 = s.replaceAll(“ba”,“12”);

    该代码的作用是将字符串s中所有的字符串“ab”替换为“12”,生成新的字符串“a12t12c”,而字符串s的内容也不发生改变。

    如果只需要替换第一个出现的指定字符串时,可以使用replaceFirst方法,例如:

 

    String s = “abatbac”;

    String s1 = s. replaceFirst (“ba”,“12”);

    该代码的作用是只将字符串s中第一次出现的字符串“ab”替换为字符串“12”,则字符串s1的值是“a12tbac”,字符串s

 

6今天将实现没发一贴生成新的jsp页面的功能实现了

获益良多,在昨晚睡觉的时候想到几个方法,但是今天给出了更好的方法!!

 

7:在实现一个action跳到另一个anction 的方法时候:

在同一个package下(即相同的namespace)

  <result name="success" type="chain">list</result> <!-- 同一个namespace跳转到另一个action -->
不同的package

<action name="loginAction" class="cn.huanglei_jmr.action.LoginAction" method="login">
   <!-- <result name="success" type="chain">/content/list.action</result> --><!-- 同一个namespace跳转到另一个action -->
   <result type="redirectAction"><!--  不同namespace-->
    <param name="actionName">list</param>   actionname是list
    <param name="namespace">/content</param>  namespace是content
   </result>
   <result name="error">/WEB-INF/page/login.jsp</result>

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来附加请求参数,但是这往往会导致ServletActionRedirectResult报找不到xxx属性的警告,这大概是由于无法识别是IOC注入,还是参数附加URL导致的,虽然是WARN级别,不过宁可写成xxx?a=x&b=y的形式,而&还需要写作&amp;的格式,否则会报xml格式错误。(另外,这种url形式,作为param的actionName的值也是可以正常使用的)

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
 public void testUDecode() {  
    String str = "make in \u4e2d\u56fd";  
    for(char ch : "make in 中国".toCharArray()) {  
         if(ch > 128) {  
              System.out.print("\\u"+Integer.toHexString(ch));  
        } else {  
              System.out.print(ch);  
        
    
      System.out.println();  
     System.out.println(str);  
  str = "make in \\u4e2d\\u56fd";   
     String v = "'"+str+"'";  
     System.out.println(v);    
      try {  
         System.out.println(new JSONTokener(v).nextValue().toString());  
     } catch (Exception e) {  
          e.printStackTrace();  
     
   记得下载json包,含BBS开发的笔记大全!!!

 8 打开tomcat的时候出现错误:

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"  align="center">才移到中间,不知道是啥原因,虽然这个

问题是解决可,但是不知道原理,哪位大神能解决,希望给留言,感激不尽,继续写bbs

另摘取一段网上相识的问题写在这里,给网友帮助!表格嵌套布局图片在IE浏览器下正常,在火狐和chrome浏览器下图片不左右居中,在单元格内呈左对齐。解决方法:

不同的浏览器对DIV的支持不一个,目前最好的浏览器是Firefox.这里涉及到两个属性,一个是line-height,另一个是vertical-align。在IE里面,只需要line-height就可以实现这个效果,不过要想在firefox也实现这样的效果,必须用到vertical-align,而且这个属性一定要定义在image上面,而不是定义在div上
代码如下:   

<html>
<head>
</head>
<style>
.abc{
 width:200px;
 height:180px;
 padding:5px 5px 5px 5px;
 background-color:#FFFFFF;
 border: #FFFF00 1px solid;
 margin-left:auto;
 margin-right:auto;
 line-height:150px;
 }
 .abc img{
 vertical-align:middle;
 }
 </style>
<body>
<table  width="500" border="2" cellspacing="10" cellpadding="0" align="center">
     <tr>
    <td>
     <div class="abc"><img src="images/pic1.jpg" alt="示例图片" width="200" height="100" /></div>
    </td>

    </tr>

</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

然后再上传的时候注意上传表单的:

  <input type="file" name="upload" id="fuPhoto" title="选择图片" />
     <input type="submit" value="上 传" id="btnUpload"  />

尤其注意upload,在对应action中可以接收于此对应的三个属性:

private File upload;// 封装页面文件域对应的文件内容 type="file"
 private String uploadContentType;// 接受依赖注入的属性,命名是固定的
 private String uploadFileName;// 接受依赖注入的属性,命名是固定的

一定注意了!!!!!!!!!!!!

 6月23日,还没有将cke做出来,完了几天了,我的思路出错了,我本想将servlet的例子迁移到我的action中去,但是我想错了一个地方就是怎样对上传文件的类型进行管理,在servlet中可以有一个initParam参数配置在web.xml中,然后我可以servlet中使用getInitParameter可以取到这个参数字符串,然后进行字符划分与上传的文件进行比对。上传文件怎么得到其文件名呢?

在input file中我没知道直接可以拿到;但是在cke中,是通过:

FileItemFactory factory = new DiskFileItemFactory();//factory=org.apache.commons.fileupload.disk.DiskFileItemFactory@a48f13
   ServletFileUpload upload = new ServletFileUpload(factory);//upload=org.apache.commons.fileupload.servlet.ServletFileUpload@1987327
     try {
    List items = upload.parseRequest(request);
//    System.out.println("items中是啥:"+items.get(0));//
//    items中是啥:name=hljmr.jpg, StoreLocation=C:\apache-tomcat-6.0.36\temp\\upload_55c23ee8_13f6ee17b28__7ffb_00000000.tmp, size=110905bytes, isFormField=false, FieldName=upload   这个很重要!!
    Map fields = new HashMap();
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
     FileItem item = (FileItem) iter.next();
     System.out.println("item="+item.getName());///hljmr.jpg得到文件名了

     if (item.isFormField())
      fields.put(item.getFieldName(), item.getString());  

   else
      fields.put(item.getFieldName(), item);
    }
       FileItem uplFile = (FileItem) fields.get("upload");
    System.out.println("uplFile"+uplFile.getFieldName());//输出的是:upload,见上面items

String fileNameLong = uplFile.getName();//文件名得到
    fileNameLong = fileNameLong.replace('\\', '/');
    String[] pathParts = fileNameLong.split("/");

    String ext = getExtension(fileName);
    System.out.println("ext="+ext);
    fileName = fileFormatter.format(dNow) + "." + ext;
    String nameWithoutExt = getNameWithoutExtension(fileName);

    File pathToSave = new File(currentDirPath, fileName);
    fileUrl = currentPath + "/" + fileName;//这个在点击上传到服务器后就会返回这个url地址/CKE/UserFiles/Image/201306/20130623143427843.jpg,然后再页面中显示也是这个地址!

在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">    
     <result name="success" type="stream"><!--type 为 stream 应用 StreamResult 处理-->    
         <param name="contentType">application/octet-stream</param><!--默认为 text/plain-->      
         <!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->    
         <param name="inputName">inputStream</param>        
         <!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名,这里使用的是动态文件名,${fileName}, 它将通过 Action 的 getFileName() 获得文件名 -->    
         <param name="contentDisposition">attachment;filename="${fileName}"</param>    
         <param name="bufferSize">4096</param><!-- 输出时缓冲区的大小 -->    
     </result>    
</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
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)

解决方法:
打开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">
   <result name="success">/WEB-INF/main/manage.jsp</result>
   <result name="error">/manager.html</result>
  </action>

如果我的登陆用户名错误的话,那么使用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页面中进行代码的编写,发现很多有趣的事情:

   a:meAddress=meAddress.replaceAll("\\\\", "/");//居然不能写成\\表示反斜杠,我去,但是在正常的情况下还是写\\

   b:

   out.write(request.getRequestURL()+"------");//直接可以得到当前页面的访问地址:http://localhost:8080/MyNet/Jpage/2013-07-07-16-49-47.jsp

 out.write(request.getRequestURI()+"------");//c:tomcat...../.jsp硬盘地址
    String meAddress=application.getRealPath(request.getRequestURI());//会C:/apache-tomcat-6.0.36/webapps/MyNet/MyNet/Jpage/2013-07-07-16-49-47.jsp

 

17:必须得写下这些知识点:

jquery的ajax:

<script type="text/javascript">
$(document).ready(function(){
 // alert("ok!");
 var l = "";
 $.ajax({
         url:'<%=path %>/manager/changeNum.action?meAddress=<%=meAddress %>',
         type:'GET',
         async:false,
         dataType:"json",
         success: function(data){
          var dataobj=eval_r(data);
          //alert(dataobj.lookback);
          l=dataobj.lookback;
          //$("#lookNum").html()
          alert($("#lookNum").html(l));//text("")不是=号赋值,见下面区别
         },
         error:function(){
          alert("error!");
         }
 });
});
</script>

action端:

lookNum="{"lookback":"+lookback+"}";//注意引号 {"lookback":'"+lookback+"'}返回的数据是:{"lookback":'31'}
  out.print(lookNum);

我写的时候缺了上面的dataType于是导致不能进入success回调函数,还有返回的json数据格式很重要!!

据说必须是:{"key":value}---->value若是字符串必须是"abc",数字和boolean不需要

  1. .html():读取和修改一个元素的HTML内容,详情.html();如果选择的标签体内有htnl标签这个一起取到
  2. .text():读取和修改一个元素的文本内容,详情.text();这个只取其中文本
  3. .val():读取和修改一个表单元素的value字段值,详情.val()

 

18:遇到一个超级无敌的瓶颈,在写回复模块的时候,想使用<s:interator,但是没有考虑到我的帖子都是直接jsp后缀就可以进行访问的。这个时候没有经过action的jsp是会出错的,就像我的帖子显示列表页面一样:

我现在能想到的解决方案是:

1:如果能找到请求action并能跳到当前页的方法是可以解决的,那么我将使用ajax的方法进行,return null是不可行的,而且我的帖子的名称是不定的肯定不能再struts.xml中进行配置

2:重写jsp页面当每次进行回复的时候,这个我没有找到在指定位置写入的方法write(byte[] b, int off, int len) 这个肯定是不行的,因为这个方法我们在使用的时候都是byte[1024]然后向这样读入到数组中,然后再写,我的文件不适用这种!1!

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点取
%{}用于计算表达式
      如%{10+20}结果将输出30
      如%{"a"+"b"}结果将输出"ab"
#通常强调从上下文取
      如#parameters.name[0]等价于request.getParameter("name")
      如#session.name等价于session.getAttribute("name")
      如#request.name等价于request.getAttribute("name")
%{#}仍然用于计算表达式,只不过操作元可以是变量
      如先定义一个变量
      <s:set name="age" value="%{25}"/>
      则%{#age}将输出25,也可以省略"#",写为%{age}
      若将age加10,可这么写:
      %{#age+10},将输出30.不能省略"#"。也就说变量用于计算时不能省略"#"

根据上面说的我实现了: 
<s:if test="#session.username!='' && #session.username!=null">
欢迎您:${username }&nbsp;&nbsp;
<a href="#"><font size="-1" color="#000099" >个人中心</font></a> &nbsp;&nbsp;<a href="<%=path %>/content/hrefAction.action"><font size="-1" color="#000099" >发帖</font></a>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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}/>">
           - <span class="jive-paginator"> [</span></span>
          <span class="nobreak"><span class="jive-paginator">
          <a href="<%=path %>/content/list.action?pageNo=1">第一页</a></span></span>
          <span class="nobreak"><span class="jive-paginator">|</span></span>
          <span class="nobreak"><span class="jive-paginator">
        
          <a href="<%=path %>/content/list.action?pageNo=<s:property value="pageNo-1"/>">上一页</a>
          </s:if>

字符串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){
  var v=value;
  //alert(v);
  <%-- 用ajax不能刷新页面这里无用!
   $.ajax({
         url:'<%=path %>/content/gosort.action?option='+v,
         type:'GET',
         async:false,
         success: function(){
         //window.location.reload();
         },
         error:function(){
          alert("error!");
         }
 });  --%>
  window.location="<%=path %>/content/gosort.action?option="+v ;
 
 }

<select οnchange="gosort(this.options[this.options.selectedIndex].value)" >
              <option value="1">时间倒序</option>
              <option value="2">时间正序</option>
              <option value="3">回复数</option>
              <option value="4">浏览数</option>
           </select>

实现!!!

功能实现,但是出现一个小小的问题:我使用的是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.ASTQueryTranslatorFactory
(2)选择Hibernate2.1的查询翻译器hibernate.query.factory_class=
org.hibernate.hql.classic.ClassicQueryTranslatorFactory
为了使用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 id="previewdata">
<div id="filename">111.txt</div>
<div id="content">
<tr class="tr1 preview_tmp"><td>张三</td><td>1118</td></tr>
<tr class="tr2 preview_tmp"><td>张三</td><td>1118</td></tr>
</div>
</div>

function(data){
alert($(data).find("#content").html());//获取<div id="content">间的tr html代码

alert($("#content", data).html());//只能获取张三文本
}

请求插入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-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

改成

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

问题就解决了

25页面加载后就执行想要的js代码,
1:$(document).ready(function () {}//强烈注意这个$是jquery的符号,所以这个js必须导入在jquery的后面,写在页面中的js是最后导入的:@:
2:不要jquery刻意这样写:<script language="javascript" for="window" event="onload"> 
和window.οnlοad=function()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值