2011-10-24
关于进入haier之后,就接手的第一个实践性的项目[9月中旬到10月中旬],有很多学习到的地方,自然有很多需要总结的。
[对于自己来说,都是需要注意的或是没有用过的,都是新的知识点]
今总结如下:
- 创建jsp 文件(显示页面),创建代码文件(后台控制,service,action)。
- 其他文件:struts配置文件,i18n文件,js文件,css文件等。
- 新技术:EJB jquery 新服务器:glassFish
在接到项目初期:主要是jsp页面,action处理,service模拟数据。
中期:调用对方的EJB接口。[他们提供的EJB接口,是利用了EJB技术调用数据库里的数据,当所有的一切都写好了,只是我们在action前调用他们现成的接口即可,与EJB技术本身理解上不是很深,如同模拟数据的service层]
后期:修改,改进,精化。
在时间周期上,最浪费时间的就是:了解EJB接口;glassFish的部署;后期修改。
详细总结各种细节:
Jsp文件:根据本项目使用struts框架,便于处理,所有的jsp文件都导入struts2标签
<%@ taglib uri=”/struts-tags” prefix=”s”%>;同时所有文件编码必须是UTF-8,所以在头文档里<%@ page language=”java” pageEncoding=”UTF-8”%>
一、jsp页面
在jsp页面,最重要的,也是在此项目中收获最多的就是页面传值和验证信息。
公共样式:引入公共的样式表,调好div布局,或table布局。
页面传值:
(1)一般使用<s:hidden name=”homeUser.usersId.id” /> 如果当前对象是homeUser,那么只写name属性,即可得到值。如果当前对象不是homeUser,
就是用value属性获得,
比如<s:hidden name=”homeUser.id” value=”homeMember.homeUserId.id”/>,在成员页面往回返的时候,需要homeUser的id,就可以通过homeMember先获得HomeUser对象,在得到id。【具体细节仍需深思!】*:传值时要考虑返回页面需要的参数。
(2)在页面链接action需要传参数时,
比如:familyUserDetails.action?homeUser.usersId.id=’<s:property value=”id”/>’,
最难理解的是:为什么本页没有homeUser对象[当前页是列表,users对象],却可以传homeUser对象?在此须明白,这并不妨碍,homeUser.usersId.id即users.id;homeUser对象是传往下一个页面,而homeUser.usersId.id值在本页中有即可。要求后者<s:property value=”id”/ >在本页可取到值。
验证信息:通常以为在后台action验证了即可,为了规范标准,前台也需要验证。
在页面验证时需要注意:
<s:textfield name=”hu.userName” cssClass=”stext required” maxlength=”60”>表示此字段是必选项的单行文本输入框,限制字符60个,与数据库保持一致。
此行代码下是<s:fieldError theme=”custom”>
<s:param>hu.userName</s:param>
</s:fielderror>
后台对此字段的验证。Theme=”custom”为了确保页面显示的美观,在一行内显示,即在输入框后是提示。
注意事项:[jsp页面上的注意事项:]
返回的一个字段是多项时,需要返回list,
1单选:比如:性别、状态;<s:radio name=”hu.status”
List=”#{getText(‘users.status.disable’):getText(‘users.status.disable’),
getText(‘users.status.enable’):getText(‘users.status.enable’)}”
在此是一个实现了国际化的,list集合里面是两个元素 禁用 启用,
2下拉列表: 当返回是两个以上,从数据库里面取得数据,比如:社区下拉列表;
<s:select list=”coms” listKey=”id” listValue=”name” name=”hu.community”></s:select>
coms是从后台获得的返回回来的数据,coms拥有id和name,在页面上显示name[listValue=”name”决定的],而返回的是用id识别的[listKey=”id”决定的],如果coms只有name没有id,在<select>标签中那么写是错误的,是找不到的。
为了保证兼容浏览器,js代码最好是用jquery的形式获取到元素,再对它操作。
$(document).ready(function(){
$(‘#form’).validate();
$(‘#btnSubmit’).click(function(){
$(‘#form’).submit();
});
});
关于隐藏域。
形式:<s:hiddern name=”” value=””/>
<input type=”hidden” name=”” value=””/>
含义:最大的作用:传参,传当前页不能显示的值。
<s:hiddern name=”homeUser.id”/>当从action跳往这个页面时,返回了homeUser对象,则这样写肯定能得到homeUser的id的值,如果action返回的不是homeUser对象,比如homeMember对象,此时这样写是得不到的,应该:
<s:hiddern name=”homeUser.id”
Value=”homeMember.homeUserId.id”/>,才能获得到。
隐藏域就是往action传递参数,name要和要传的对象相对应。
二、后台action代码
在后台代码的实践中,最大的收获就是逻辑。
最大的失误也是逻辑混乱,要考虑的重点就是该action所要接收的参数,和返回的对象。
即传往jsp页面的参数。
同时,每个action方法后可跟validate***()验证方法,在程序运行时,会默认首先进行validate方法的校验,然后再执行,action对应的方法。
如果验证通不过,此时需要return; 表示默认返回当前页。
[必须在struts配置文件中配置返回为input的情况]
注意点:当一个方法未成功还是停留在本页的时候,需要保留本页的参数对象,而调用方法之后此时未必保留住参数,则需要在未通过之前再调用一下相关的方法获得相应的参数对象,以便停留当页还正常显示。
三、其他文件。
I18n国际化文件:
massageResource_zh_CN.properties配置文件中,使用键值对的形式,而在前台后台取法不同,在jsp页面上,<s:text name=”key”/>
如果是在struts标签内取值,比如value=”%{getText(‘key’)}”,则使用EL表达式。
在后台的取值,同样使用this.getText(“key”);
带参数的形式:this.getText(“key”,new String(“100”)),
在配置文件里如:最大值不得超过{0};0表示第一个参数,以此类推。
注意事项(细节):1.关于struts2验证:ActionMassage、ActionError、FieldError
(1)当对一个form表单中的一个字段进行验证的时候,使用FieldError,后台:this.addFieldError(args1,args2);args1表示那个字段,args2表示提示的错误信息
在页面上使用<s:fieldError>
<s:param>args1</s:param>
</s:fieldError>
输出,显示
(2)当出现错误需要返回或提示时,使用ActionError,后台:this.addActionError(args);args直接将错误的提示或警告写入,在页面上使用<s:actionError/>即可输出,显示
(3)当出现需要提示,使用ActionMassage,后台:this.addActionMassage(args);args直接将提示的信息写入,在页面上使用<s:actionMassage/>即可输出,显示
- struts配置文件struts.xml
action中 type 是redirect 后,在action中添加参数,实现页面跳转后,消息能正常输出
<action name="setRoleToUser" method="setRoleToUser" class="com.haiersoft.uhome2.boss.user.action.UserRoleAction">
<result name="success" type="redirectAction">listPlateFormUsers_.action?msgs=${msgs}&errs=${errs}</result>
<result name="error">/user/userException.jsp</result>
</action>
- 关于必选输入项的设置[即在必须的输入框后面加一个红色的*]
必输入项目要求,在输入框后面增加红色 *
修改如下:
1. 必输入项目上,增加 css class required
<s:textfield name="users.userName" cssClass="stext required" maxlength="30"/>
2. 引入 jquery.required.js :<script type="text/javascript" src="../js/jquery.required.js"></script>
3. 在ready事件中,调用 $(".required").requiredTip();
$(document).ready(function() {
$(".required").requiredTip();
}
- 关于省市县的地区级联下拉列表[博客园总结]
- 每个页面的返回按钮,要指定执行那个action或是那个jsp页面,不可使用history.back(),
容易造成混乱。