六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 30|回复: 0

基于struts的web应用开发总结(一)

[复制链接]

升级  81.33%

46

主题

46

主题

46

主题

秀才

Rank: 2

积分
172
 楼主| 发表于 2013-1-23 02:54:03 | 显示全部楼层 |阅读模式
以前经常写的代码,过一了段时间再写发现了一些问题,说明了自己对代码的理解不够。总结如下:
一:
编辑某一条记录,点击“编辑”按钮,当打开的是一个新的页面(如模态框)时,想到记录的ID传到打开的页面去。因为打开的页面与原来操作的页面不是同一个window,所以当执行点击“编辑”按钮操作时,没办法把值赋给打开的页面的元素(如隐藏元素)。如:
 $("PHONE_LIST_ID").value = phone_list_id//这种作法是不行的,取不到$("PHONE_LIST_ID"),因为操作的页面与$("PHONE_LIST_ID")所在的页面不是同一个页面。
这时,可以用URL参数传递的方法,如下:
url = "/epub_web/jsp/phone_list_mgr/get_classify_phone.do?PHONE_LIST_ID="+serial_num;  window.showModalDialog(url,'',"dialogWidth=600px;dialogHeight=400px");  
在打开的JSP页面里用:value="<%=request.getParameter("PHONE_LIST_ID")%>",如下:
<input type="hidden" name="PHONE_LIST_ID" id="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"></input>  所以,通过url参数传递的方式,可以实现跨页面的参数传递,而不用用隐藏域来传递。这在跨页面的参数传递中,特别是类似于对记录的编辑操作等,可以很好地适用.
二:
上面第一点的:
<input type="hidden" name="PHONE_LIST_ID" id="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"></input>
这行代码我原来是用<html:hidden>,如下:
<html:hidden property="PHONE_LIST_ID" value="<%=request.getParameter("PHONE_LIST_ID")%>"/>
因为我本机是在jboss的环境,但是当拿到webspheer的环境下却有提示错误,以前好像就有发现这个情况,也不知道是为什么,先记录下来。
三:
由于粗心,在xml配置时,<action path="" type="" name="" scope="" parameter=""></action>中把name=""这个属性漏掉了,所以程序跑起来时,在servlet端的ActionForm老是提示为null,这发了一些时间。以后有时间的时候好好弄清楚struts的配置的属性的作用。
四:
在servlet端,用struts的ActionForm自带的get和set方法时,发现前台没有set成功。后来查了很久才知道,前台没有用struts自带的html标签,如<hmtl:text>我就直接用<input type="text"/>,所以struts认不到,在action端用set方法当然前台没有反应了。以前也遇到过这些问题,时间一久就忘了,所以还是需要做些记录。
五:
数据库里字段用char与varchar2不同,有些人喜欢用char,比如用char(2),如果值是'1'的话,那么在数据库里后面还有个空格。所以,当在action端用set方法时并没有得到我们想要的结果,出现这种
情况时,有如下几种解决方法
 1.一是设计数据库的人只有在确定值是确定位数时才用char,否则都用varchar2。
 2.二是在写sql语句时用trim()方法来截掉空格。
 3.三是在取到有空格数据时用substr来处理。

六:
关于checkbox,一般我们都是用一个name来构成一个checkbox数组,这样因为是一个数组,每次就只能选中一个值。一般用循环来处理每个checkbox元素,如下:
 
       function getRadioValue(objRadio){            var resultValue;            var j = objRadio.length;            for(var i=0;i<j; i++){                if(objRadio.checked) resultValue = objRadio.value;            }            return resultValue;        }        function isChecked(radioObj){            resultChecked = false;            for(var i=0;i<radioObj.length;i++){                if(radioObj.checked){                    resultChecked = true;                    break;//这里是break退出循环并继续往下执行,而不是return。                }             }            return resultChecked;        } 
七:
很经常,我们需要多个引号来构造,这些引号可能嵌套,这种写法很容易很错。注意以下几点:
     1.可以适当地把一些拿出来构成一个函数来引用,引用可以减少引号的使用。
     2.单引号里面可以用多引号,同样,多引号里面也可以用单引号,而不需要转义。
     3.转义符可以一直嵌套下去,比如\\"\\"需要嵌套的时候可以\\\"...\\\"。
     4.可以用"来代替引号。
例子如:
document.write("<span   style=\"width:100;background-color:yellow\"   onclick=alert("test")   onmouseover='status=\"abcd\\\"defg\\\"hijk\"'>test</span><br>");   
八:
jsp端与action端交互,常常用如下方法:
     (1).前台发送一个ajax请求,后台处理请求后返回一个jsp页面,前台用得到的jsp页面的html代码赋值给需要显示的元素,如div等。如:
        pars = "ENGAGE_INFO_ID="+$F("ENGAGE_INFO")+"&ENGAGE_DTS_IDLIST="+projCommJs.getCheckboxValue();        new Ajax.Request(this.modulePath+"addtoInfo.do",{            parameters:pars,            onCreate:function(){            },             onComplete:function(returnStr){$("Engagediv").innerHTML = returnStr.responseText;                 $("btnRefresh").fireEvent("onclick");             }         }            ); (2).前台发送一个ajax请求,后台处理请求后并不是返回一个jsp页面,而是构造一个html代码,再把这个html代码发送到前台。
public static void responseText(HttpServletResponse res, String s){        //指定内容类型        res.setContentType("text/html;charset=GBK");        //禁止缓存        res.setHeader("Pragma","No-cache");           res.setHeader("Cache-Control","no-cache");           res.setDateHeader("Expires", 0);         try {            PrintWriter out = res.getWriter();            out.print(s);            out.close();        }        catch (IOException e) {            e.printStackTrace();        }    } 3).前台发送请求,后台把需要在前台显示的值放在request或session中,前台可以用标准的jsp标签或自定义标签来分析request或session中的值来进行显示。这部分的内容可以看看书jsp与servlet的书,如:oreilly.JSP设计第二版等书。
九:
在前台发送ajax请求时,参数如果是一个表单,表单里有很多的元素,这时候不需要一个个去写,可以用Form.serialize(),如下:
var pars = encodeURI(Form.serialize(document.forms[0])); 用这种方式传递到action端后,因为参数是经过编码的,所以,在action端需要解码,而不能只是能过request.getParameter()来取值。(如果前台是如form.submit()或是没有编码的参数传递过来就不需要),要不然汉字会是乱码。如下:
   private String urlDecode(String str) throws Exception{        try{            str = java.net.URLDecoder.decode(str, "UTF-8");                    }catch (Exception ex){            System.out.println(ex.getMessage());            ex.printStackTrace();        }        return str;    } 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表