- 浏览: 1370775 次
- 性别:
- 来自: 北京
最新评论
-
cyzshenzhen:
delaycall.js 修改表单延迟自动提交的 jQuery ...
JS实现根据用户行为延时提交 -
u010549818:
<value>classpath:/my/pack ...
使用Spring的mappingDirectoryLocations来配置Hibernate映射文件 -
xyswords:
撸主不要误导人,尽量不要用inner join,他和where ...
inner join和where区别 -
shisanshe:
我也是这个问题,加了<property name=&qu ...
No CurrentSessionContext configured!" 异常解决方案 -
zqb666kkk:
nice 不错哦
关于BigDecimal.ROUND_HALF_UP与ROUND_HALF_DOWN
导读:
1、
org.springframework.orm.ObjectRetrievalFailureException: Object of class [com.xindeco.myregister.pojo.MyRegisterInfo] with identifier [14]: not found
MyRegisterInfo在数据库没有identifier [14]对象。
2、
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert="false" update="false")
出错原因:password 和repassword同时对应数据库表中的password一列,同时update和insert都设为true。
xml文件如下:
<property name="password" <br="">type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/> type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/>
<property name="repassword" <br="">type="java.lang.String"
update="false"
insert="false"
access="property"
column="password"
length = "32"
/> type="java.lang.String"
update="false"
insert="false"
access="property"
column="password"
length = "32"
/>
解决的方法:
将repassword的insert和update设为false。
3、
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed;
nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class
错误原因:hibernate的映射文件中ID是大写的,而pojo的类中id是小写的
注意事项:每个pojo的类都要继承abstractEntity,其中abstractEntity类有个ID的属性要重写
public abstract class AbstractEntity
implements Entity, BaseDTO {
abstract public long getID();
abstract public void setID(long id);
public int hashCode() {
return (int)this.getID();
}
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Entity) {
return this.getID() == ( (Entity) obj).getID();
}
return false;
}
}
4、
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
错误原因:
在application.xml文件中deleteRegister方法以delete开头,并没有被设定为可更改的,应如下设置:
<bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true" id="baseTxProxy">
<property name="transactionManager">
<ref bean="transactionManager">
</ref></property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="cancel*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
加上一行
<prop key="delete*">PROPAGATION_REQUIRED</prop>
5、
ERROR org.apache.struts.util.RequestUtils - Error creating form bean of class com.xindeco.business.web.form.GraAppInfoForm
public class GraAppInfoForm
extends ActionForm 错误写成
public abstratic class GraAppInfoForm
extends ActionForm
6、
2006-04-25 08:56:38,495 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@8e2fb5
java.lang.ClassCastException: $Proxy0
at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at com.xindeco.core.web.action.BaseAction.dispatchMethod(BaseAction.java:153)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
actioin类中的newone方法如下:
public class GraAppAction
extends BaseAction {
public ActionForward newone(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
GraAppService graservice = (GraAppService) this.getBean("GraAppService");
}
applicationcontext中的GraAppService的配置如下:
<bean class="com.xindeco.business.dao.impl.GraAppDAOImpl" id="GraAppDAO">
<property name="support">
<ref local="support">
</ref></property>
<property name="sessionFactory">
<ref local="sessionFactory">
</ref></property>
</bean>
<bean id="GraAppService" parent="baseTxProxy">
<property name="target">
<bean autowire="byName" class="com.xindeco.business.service.impl.GraAppServiceImpl">
<property name="baseDAO">
<ref bean="GraAppDAO">
</ref></property>
</bean>
</property>
</bean>
因此this.getBean("GraAppService");是为了得到GraAppServicImpl类的实现。GraAppService是interface
public class GraAppServiceImpl extends BaseServiceImpl
implements GraAppService{
}
7、org.hibernate.hql.ast.QuerySyntaxException: Demand is not mapped. [from Demand where unitid = ? and needNum >usedNeedNum]
hibernate.cfg.xml没有配置Demand.hbm.xml文件的目录
8、org.springframework.jdbc.BadSqlGrammarException: Bad SQL grammar [] in task 'Hibernate operation'; nested exception is java.sql.SQLException: 列名 'id' 无效。
java.sql.SQLException: 列名 'name' 无效。
因为hibernate声明的id,name的columnid属性没有与数据库的字段对应,所以id,name无效。
9、java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:415)
at java.lang.Integer.parseInt(Integer.java:497)
at com.xindeco.business.service.impl.DemandServiceImpl.findDemandListByUnitId(DemandServiceImpl.java:33)
错误语句为
needNum = Integer.parseInt(demand.getNeedNum());
usedNeedNum = Integer.parseInt(demand.getUsedNeedNum());
因为demand.getUsedNeedNum()==null,无法转化为string 类型,
10、rg.apache.jasper.JasperException: /GraAppInfo/GraAppInfoNew.jsp(343,29) According to TLD, tag bean:write must be empty, but is not
错误的原因:
请选择 <logic:notempty name="politicsList"> <logic:iterate name="politicsList" id="politics"> </logic:iterate></logic:notempty> ? property="codeID"></bean:write><bean:write name="politics" property="codeName"> </bean:write>
就因为少了/>
以后懂得通过查找字数,来检查错误
11、2006-04-26 13:27:54,812 ERROR com.xindeco.core.util.BeanUtils - bean property [Nation] copy failed
com.xindeco.core.exception.ConvertException: org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.String; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.String
beanUtil.beanCopy(grapojo,form,BizConstants.CONVERTER);
要求:
1、pojo类的属性只有与form属性名字相同,才能beancopy成功
2、pojo中属性是实体,在form中一定要用int,long表示
出现这错误的原因是pojo中的属性不是实体,而错误写成:
string
private String nation;应改成 private Syscode nation;
12、
2006-04-26 14:38:37,843 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@fa1b2d
java.lang.NullPointerException
at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
hibernate配置文件没改,程序找不到相应的类
<many-to-one <br="">name="FSUnit"
class="com.xindeco.business.pojo.EmployUnitBaseInfo"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/> name="FSUnit"
class="com.xindeco.business.pojo.EmployUnitBaseInfo"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/>
其实FSUnit对应的类应该是FSUnit
<many-to-one <br="">name="FSUnit"
class="com.xindeco.business.pojo.FSUnit"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/> name="FSUnit"
class="com.xindeco.business.pojo.FSUnit"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/>
13、
org.hibernate.MappingException: An association from the table GraAppInfo refers to an unmapped class: com.xindeco.business.pojo.FSUnit
错误原因:hibernate.cfg.xml没有配置fsunit.hbm.xml文件的位置
14、
java.lang.ClassCastException: com.xindeco.business.dao.impl.GraAppDAOImpl
at com.xindeco.business.service.impl.GraAppServiceImpl.addGraduateApp(GraAppServiceImpl.java:16)
GraAppServiceImpl.java:16
第16行: GraAppDAO dao = (GraAppDAO) this.getBaseDAO();//其实得到的是GraAppDAOImpl
错误的原因是
public class GraAppDAOImpl
extends BaseDAOImpl {
}
没有实现GraAppDAO接口,正确的做法是
public class GraAppDAOImpl
extends BaseDAOImpl implements GraAppDAO {
}
先继承后实现
15、2006-04-27 08:38:54,078 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@1d6399b
java.lang.ClassCastException: com.xindeco.business.pojo.SysCode
at org.hibernate.type.StringType.set(StringType.java:26)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:63)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:40)
一般是因为hibernate声明类型和pojo类声明的类型不一样,并且前面已经出现了Hibernate: insert into TGraAppInfo (name, whereFrom, degree, college, speciality, studentRelTel, remark, higherEduLength, highSchool, studyResume, normalOrNot, proxyUnit, workPost, workPlace, studentAddress, studentPostNumber, nation, appStatus) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
的操作提示,查出错误的原因有:
<many-to-one <br="">name="demand"
class="com.xindeco.business.pojo.Syscode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/> name="demand"
class="com.xindeco.business.pojo.Syscode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/>
<property <br="">name="appStatus"
type="int"
update="true"
insert="true"
access="property"
column="appStatus"
length="10"
/> name="appStatus"
type="int"
update="true"
insert="true"
access="property"
column="appStatus"
length="10"
/>
应改为
<many-to-one <br="">name="demand"
class="com.xindeco.business.pojo.Demand"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/> name="demand"
class="com.xindeco.business.pojo.Demand"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/>
<many-to-one <br="">name="nation"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="nation"
/> name="nation"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="nation"
/>
16、
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.xindeco.business.pojo.SysCode
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:626)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)
at
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)
pojo类为:
public class GraAppInfo{
private College college;
}
action 类为
public class GraAppAction
extends BaseAction {
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
graInfo.setCollege(new College());\\必须从数据库找到college这个对象,而不能新生成
graInfo.getCollege().setID(graForm.getCollegeID());
graInfo.setAppStatus(Integer.parseInt("0"));
service.addGraduateApp(graInfo);
}
public class GraAppServiceImpl extends BaseServiceImpl
implements GraAppService{
public boolean addGraduateApp(GraAppInfo info)
{
this.getBaseDAO().save(info);
return true;
}
}
dao类save方法为
getHibernateTemplate().save(obj);
当cascade="all",插入new college 除了id和原来的记录一样,其他的字段全部都被更新,为null
当cascase=“insert”,插入new college 只会把它的id插入grainfo表中,其他字段不变。
17、java.sql.SQLException: Unable to convert between java.lang.Integer and BLOB.
因为
<property <br="">name="province"
type="com.xindeco.business.pojo.SysCode"//不能用复杂类,
update="true"
insert="true"
access="property"
column="provinceId"
/> name="province"
type="com.xindeco.business.pojo.SysCode"//不能用复杂类,
update="true"
insert="true"
access="property"
column="provinceId"
/>
应该改为
<many-to-one <br="">name="province"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="provinceId"
/> name="province"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="provinceId"
/>
18、javax.servlet.jsp.JspException: Cannot create iterator for this collection
at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:265)
jsp文件如下:
<logic:notempty name="graduateList">
</logic:notempty><logic:iterate name="graduateList" id="graduate">
graduateList是一个类,而logic:iterator要求必须是ArrayList,HashSet....这样的集合类,而graduateList中一个属性是ArrayList或HashSet的
应改为:
</logic:iterate><logic:notempty name="graduateList" property="items">
<logic:iterate name="graduateList" property="items" id="graduate">
19、2006-05-11 17:13:37,468 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@bc22eb
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
SysUser user= (SysUser) request.getSession().getAttribute(WebConstants.SESSION_USER);
System.out.println(user.getRole().getRoleName());
当hibernate session取出数据放到http session时,
由于sysuser中role的lazy=“true”,所以没有将RoleName放到http session中,当System.out.println(user.getRole().getRoleName());
时,虽然http session还开着, hibernat seesion已经关闭
<many-to-one <br="">name="role"
class="com.xindeco.business.pojo.SysRole"
lazy="false"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="roleID"
/> name="role"
class="com.xindeco.business.pojo.SysRole"
lazy="false"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="roleID"
/>
20、Association references unmapped class: com.xindeco.workflow.WFNode
因为application.xml文件中没有配置<mapping resource="com/xindeco/workflow/WFNode.hbm.xml">
系统找不到WFNode
name = "nodes "
table = "WF_ROLENODES "
lazy = "true "
inverse = "false "
cascade = "none "
sort = "unsorted "
> name = "nodes "
table = "WF_ROLENODES "
lazy = "true "
inverse = "false "
cascade = "none "
sort = "unsorted "
>
<key <br="">column = "roleID "
> column = "roleID "
>
<!---->
<many <br="" many="" -="" to="">class = "com.xindeco.workflow.WFNode "
column = "nodeId "
outer - join = "auto "
/> class = "com.xindeco.workflow.WFNode "
column = "nodeId "
outer - join = "auto "
/>
<!---->
12:45 | 永久链接 | 浏览 (184) | 评论 (0) | struts |
logic:Iterator标签(以下简称“该标签”)是Struts里非常常用的一个标签,其作用在于循环显示给定容器对象中的值。
如此常用的标签,其源代码当然需要拿出来研究一下,以下列举几条研究成果:
1、该标签内部使用Collection来表示给定的容器,所有的给定容器对象(如ArrayList,Map等)都会被其转化成为Collection,Collection实际就是Map和List的父类。
2、该标签自己维护循环索引,不用程序员管理索引
3、该标签常见的几个属性如下:name、property、scope、id
对应Struts给出的Api说明如下:
name:包括要遍历Collection的Jsp页面的bean的名字(如果property没有被定义),或者是那些通过getter方法获得属性的Jsp中的Bean的名字,这些getter方法返回的是Collection(如果property定义了)。
property:在name命名的Jsp bean中定义的属性的名字,通过getter方法返回一个Collection
scope:指示到哪里去寻找name为名字的bean,如果没有定义缺省为"any scope"
id:如果Collection非空的话,在每次遍历时候Collection中每个元素的名字。
其中除了id每个元素均为Rt expr,这儿的rt expr的意思就是Run Time Expression。明确的说就是,如果你对一个Attribute的</mapping><rtexprvalue>指定为true,你就可以在这样的属性中使用<%=%>之类的东东。这个配置文件在tld中。
只有id是必须要说明的。
关于Api说明的说明:
id只是一个临时标识,在下面的<bean:write里面出现的name属性要和id一致才能打印出<bean:write的property,而此property就是在iterator中的属性。 <br="">
举例说明
以下代码生成一个阶梯状表格
系统 资源 操作
soft3
res3
opt3
soft12
res12
opt1211
soft11
res11
opt1111
在此之前传来一个request.getAttribute("userPurview"),所以有在第一个logic中的userPurview,就是在这个request里面寻找userPurview
返回的是一个list
>
<logic:iterate name="userPurview" scope="request" id="targetSys">//这个id可以随便起名,但是要注意下文使用的一致性
<logic:iterate name="targetSys" property="purviewResList" id="targetRes">
<td height="21" class="unnamed5">
<bean:write name="targetRes" property="cn">
<td height="21" class="unnamed6">
</bean:write>
<logic:iterate name="targetRes" property="purviewOprList" id="targetOpr">
<td height="21" class="unnamed4">
<td height="21" class="redzi">
<bean:write name="targetOpr" property="cn">
</bean:write>
</logic:iterate>
</logic:iterate>
</logic:iterate>
结论:
多级迭代和单层差不多,唯一注意的就是id和<bean:write中的name的对应,上级logic的id与下级logic的name对应,并且取出来的要是个collection,name和id不一定实际需要这个bean,都是虚拟的。 <br=""> 12:44 | 永久链接 | 浏览 (37) | 评论 (0) | struts |
html:form注意事项
在使用html:form时需指定action属性,特别是在使用
html标签时指定的action应在xml中找得到并且页面显示的ActionForm
应于action中使用的.do引擎相匹配,否则JSP会出错
Struts中JSP基本操作
文件头部需增加的代码
<%@ page contentType="text/html;charset=gb2312" %>
<%request.setCharacterEncoding("GB2312");%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
一般信息输出
</rtexprvalue><bean:write name="[Xml中Form-bean段的name属性]" property="[该Form-bean]成员属性">
下拉框输出
注:所有html标签(即需在form中显示的),在使用时都需在</bean:write><html:form>容器内部
<html:form action="[为处理请求的页面,如′/Hello.do′]">
<html:select property="[用于传数据的ActionForm的一个属性,该值作为默认值]">
<html:options <br="">
name="[Xml中Form-bean段的name属性]"
property="[将ActionForm的一个属性作为Option的value,该属性为Collection,]"
labelProperty="[将ActionForm的一个属性作为Option的text,该属性为Collection,]"
/> name="[Xml中Form-bean段的name属性]"
property="[将ActionForm的一个属性作为Option的value,该属性为Collection,]"
labelProperty="[将ActionForm的一个属性作为Option的text,该属性为Collection,]"
/>
</html:select>
</html:form>
逻辑叠代器使用
<logic:iterate <br="">
id="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId"
name="[Xml中Form-bean段的name属性]"
property="[Action中具为Collection属性名称]"
offset="[显示的偏移量]"
length="[显示记录数]"
> id="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId"
name="[Xml中Form-bean段的name属性]"
property="[Action中具为Collection属性名称]"
offset="[显示的偏移量]"
length="[显示记录数]"
>
<bean:write <br="">
name="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId" property="[单条记录所映射的ActionForm的属性]recordname"/> name="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId" property="[单条记录所映射的ActionForm的属性]recordname"/>
</html:form></logic:iterate>
12:44 | 永久链接 | 浏览 (28) | 评论 (0) | struts |
Struts Html标签和标准的HTML标签功能相同,这里提倡在Struts应用中使用Struts标签,这是因为这些标签可以和Struts框架的其他组件紧密的联系起来,如比标签用来定义HTML表单,Struts能够把这个表单中的数据自动映射到对应的ActionForm中.下面对具体的标签进行深度研究.首先研讨一些基本的东东,我个人认为不是很常用的,生成基本HTML元素的标签,这些标签和HTML元素对应,主要包括:
1)生成元素,这个标签有一个lang属性,用于显示用户使用的语言,设置卫true的时候,标签将先根据存储当前HttpSession中的Locale对象来输出网页数用的语言,如果没有HttpSession或者里面没有Locale对象,就根据HTTP请求头的属性来输出语言,如果HTTP请求头中没有,就根据默认的Locale来输出语言.
2)生成元素,这个用于生成当前网页的绝对URL路径.如果使用了这个标签,当该网页引用同一个应用的其他网页的时候,只需要给出相对于当前网页的相对URL路径即可.
3)生成Anchor元素,这个是超连接标签,感觉有一些好处可言,比如允许在RUL中以多种方法包含请求参数.当用户浏览器关闭Cookie的时候,会自动重写URL,把SessionID作为请求参数包含在URL中,用于跟踪用户的Session状态.它的主要属性有三种,分别是forward指定全局转发连接.href指定完整的URL连接.page指定相对于当前网页的RUL.
4)生成用户请求URI,用于输出超连接中的URL部分,但它并不生成HTML
元素.URI指的是URL中的协议,主机和端口以后的内容.
5)生成HTML元素,用于在HTML页中嵌入图片.page属性指定当前的URI.
根据我个人的一些看法,感觉Struts确实很好,但是在好的东西也有一些不实用的地方,JAVA也是如此,以上方法我比较推荐标签,感觉这个标签有十分不错的功效,下面阐述一下具体的使用方法:
1) 创建全局转发连接:首先在Struts配置文件中配置
在JSP页面中引用:index
2) 创建完整URL的连接,也就是说可以连接到其他的站点
Action
3) 从一个网页连接到同一个应用的另外一个网页
Action
4) 在URL或者RUI中包含请求参数的方法
Action
5) 在URL或者URI中包含单个请求变量的方法
pagemProperty>Action
paramId属性指定请求参数名,paramName属性指定变量名称,paramProperty指定变量卫JavaBean的属性.
研讨完了StrutsHtml标签库的基本标签,下面开始研究一个重要的东东,Struts的表单标签以及它的子标签,单选按钮,复选框,下拉列表等等,下面是详细介绍:
1)表单标签的action属性来指定当用户提交表单后,处理用户请求的组件,就是说在form里action属性比如设置了一个in.do的,那么在配置文件中action元素的path属性如果是/in,这就说明是这个action来接收form提交过来的数据.这个感觉挺简单,此外还需要知道name是设置表单名字,method是来设置请求方法,比如Get或Post.
2)文本标签的property属性指定字段的名字,它和ActionForm中的一个属性匹配,这个属于表单标签的一个子标签,可以把用户填写的值提交到具体的ActionForm中
3)标签在表单中生成取消按钮,当用户按下取消按钮的时候,产生一个取消事件,这个时间由Action来捕获,至于如何处理在Action类中的execute()方法编程实现,主要用途是在用户按了提交按钮,请求没发送过去又不想提交的时候,起到一个反悔作用.
4)标签用来生成复位按钮,类似以上的取消按钮这些实现复位,取代了HTML代码.
5)标签生成提交按钮.使用方法和取消,复位一样都是这样写代码的:
提交.
6)标签在表单上生成隐藏字段,用于在表单上存放不希望让用户看到或者不允许修改的信息,它的属性类似文本标签,property和ActionForm中的具体属性对应.如果想要在表单想显示某个值,而且不希望用户修改,可以用这个方法.
7)标签在表单上生成标准的HTML检查框,比如ActionForm中的属性是boolean类型只能有2个值,就可以在表单中使用这个标签来表示.主要通过property属性来设置对应的ActionForm属性,还有一个value属性,用来设置用户选中检查框的值,默认值是true,就是说当用value=false的时候如果用户没选择这个检查框,就把ActionForm的属性设置卫true,为了检查框能够正常工作,必须在ActionForm的reset()方法中对其复位,在value属性为true的时候,必须在reset()方法中把对应的属性设置为false.
8)标签和差不多,区别就在于它可以生成复选框.它的性能比更加灵活,可以动态的决定被选中复选框的数目,只要property属性相同,而value属性不一样,就可以和ActionBean的同一个数组对应.此外checkbox只能和blooean类型的属性对应,而multibox则没有限制.
9)标签表示单选按钮,多个标签可以组合使用.
10)标签生成下拉列表或多选列表,重要的属性是size属性指定每次网页上显示的可选的项目数量.multiple属性指定是否支持多项选择,如果设置为true表示多选列表,默认为false.property属性于ActionForm中的某个属性对应,这个属性用来存储用户在列表上选中的值.在单选的情况下,ActionForm的对应属性定义为简单类型,不能是数组.在多选的情况下类型是数组.
以上是对StrutsHtml标签库的Form系列标签以及子标签的简单阐述,这些标签不一定都常用,所以了解即可,能掌握常用的几个标签就OK了.下面研究一下文件上传,是指通过用户浏览把用户本地的文件传到Web服务器标签提供了从Html表单中上传文件的功能.这个标签也是Form标签的子标签所以必须嵌套在中,而且的method属性必须设置为Post.enctype编码属性必须设置为multipart/form-data.而且它的property属性必须设置和ActionForm中的Flie类型的属性对应.如果property=”file”则ActionForm中必须要设置private File file;属性,而且提供相应的get/set方法.然后通过Action来完成接收上传文件的功能,首先创建一个读取用户上传文件的InputStream流对象,然后创建一个把上传数据写到目标文件中的OutputStream对象,接下来通过一个驯化把数据从源文件写到目标文件中,上传就实现了.
标签用于输出错误消息,在request和session范围寻找ActionMessages或者其子类ActionErrors集合对象.在从ActionMessages集合对象中读取ActionMessage对象,把ActionMessage对象包含的错误消息文本显示在网页上.至于具体的错误文本消息存放在ResourceBundle中,而且标签能识别错误文本中的HTML元素,例如等等.标签可以存放在网页的任何地方,也可以在表单内.因为它输出错误和它在网页的位置无关.它的具体属性是.1)name:指定ActionMessages对象的属性key,标签处理类根据这个key来家查request或session范围的ActionMessages集合对象.2)property:指定消息属性,如果不设置会显示ActionMessages集合对象中所有的消息对象ActionMessage.3)bundle:指定ResourceBundle如果这个没设置,将从应用中默认的ResourceBundle中获取消息.
标签和标签有些类似,也能够在网页中输出消息,具体的属性是:1)name:指定ActionMessages对象的属性key,标签处理根据这个key来检索request或者session范围内的ActionMessages对象.2)message:指定消息的来源,如果是true则从request或者session范围内检索出属性key为Globals.MESSAGE_KEY的具体的ActionMessages对象.3)id:用来命名从消息集合中检索出每个ActionMessages对象,它和标签的name属性匹配.
Struts的标签库固然很好,但是有些是需要用的,有些也是不用也罢的,所以可以根据实际情况进行研究,不过感觉还是都了解一下的好,不一定都要会用,但是起码都能看懂就OK了呵呵^_^ (网友们的支持,是我继续写技术文章的动力!)
12:43 | 永久链接 | 浏览 (51) | 评论 (0) | struts |
Struts标签
solo L
发布日期:2005年06月01日,更新日期:2005年06月01日
您使用过旅游指南吗?它总是能让我们快速的找到目的地。我对此有深刻的印象,希望这篇指南也能使您快速的完成Struts标签相关的任务。我深入细致的总结了日常使用Struts的一些经验,感觉Struts标签的用途非常广泛并且功能强大,但是学起来还是比较费时间的。我认为学习Struts标签最好的方式就是参考良好的示例,幸运的是这些示例您可以在下面找到。
Struts是Apache Jakarta的一个著名的开源项目,目标是为构建基于Java的web应用程序提供一个框架。
Struts提供了非常多的标签,依据功能和使用习惯的不同被分到了五个标签库中:
Bean Tags:该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、headers和parameters的值创建相关bean的能力。
HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。
Logic Tags:该标签库包含的标签可以用来进行逻辑判断、集合迭代和流程控制。
Nested Tags:该标签库建立在前三个标签库的基础上,具有前三个标签库的所有功能,只是允许标签间的嵌套。
Tiles Tags:该标签库包含的标签可以用来创建tiles样式的页面。
这篇指南主要介绍前三个标签库中的标签。如果您对后两类标签也感兴趣可以查阅参考资料中的Struts的用户指南。
回页首
bean:cookie
cookie最早是由Netscape公司提出来的,用来存储客户的少量状态信息。如果您对cookie的具体细节感兴趣可以查阅参考资料中的cookie spec。
bean:cookie标签取回请求中名称为name的cookie的值。如果没有指定multiple属性则依据刚取回的值创建一个Cookie类型的bean。如果指定了multiple属性则依据刚取回的值创建一个Cookie[]类型的数组。然后用id属性值将Cookie或Cookie[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了如何使用bean:cookie标签读取名为JSESSIONID的cookie的值,并且使用了两种方式进行了输出:
<logic:present cookie="JSESSIONID">
<bean:cookie name="JSESSIONID" id="jSession">
这个cookie的名称是</bean:cookie><bean:write name="jSession" property="name">,值为</bean:write><bean:write name="jSession" property="value">。
<%
String name = jSession.getName();
String value = jSession.getValue();
out.println("这个cookie的名称是"+name+",值为"+value+"。< String name = jSession.getName();
String value = jSession.getValue();
out.println("这个cookie的名称是"+name+",值为"+value+"。
");
%>
</bean:write></logic:present>
回页首
bean:define
bean:define标签在toScope(如果没有指定值就使用page作用域)指定的作用域中创建一个新属性,同时创建一个scripting变量。我们可以通过id值使用它们。新创建的属性可以由其它标签使用,而新创建的scripting变量可以由JSP脚本使用。
我们可以使用三种方式为新创建的属性和scripting变量赋值:
通过该标签的name、property和scope取回值,并且保持类型的一致性,除非取回的值为Java的原始类型,这时会使用适合的包装器类对这些值进行包装。
通过该标签的value指定值,这时新创建的属性和scripting变量的类型为java.lang.String。
通过在该标签的体中嵌入值,这时新创建的属性和scripting变量的类型为java.lang.String。
下面的代码片段示例了如何使用bean:define标签创建新属性values和新scripting变量values,它将listForm中persons的值取出来赋给values:
</logic:notempty><bean:define name="listForm" property="persons" type="java.util.List" id="values">
下面给出ListForm的代码片段以帮助您更好的理解,其中Person是一个只有id和name两个属性的简单bean:
public class ListForm extends ActionForm {
private List</bean:define><person> persons = null;
public List</person><person> getPersons() {
return persons;
}
public void setPersons(List</person><person> persons) {
this.persons = persons;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
persons = null;
}
}
下面的代码片段示例了logic:iterate标签如何使用bean:define标签创建的新属性values:
<logic:iterate name="values" id="person">
<bean:write name="person" property="id">
</bean:write></logic:iterate>
下面的代码片段示例了JSP脚本如何使用bean:define标签创建的新scripting变量values:
<%
Person p = new Person();
for(int i=0;i< Person p = new Person();
for(int i=0;i<values.size();i++){<br>
p = (Person)values.get(i);
out.println(p.getId());
out.println("
");
}
%>
回页首
bean:header
bean:header标签取回请求中名称为name的header的值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面是我的浏览器发送的header的内容,这些内容和浏览器有关,因此您的浏览器发送的内容可能和下面列出的不同。不过这没有关系,因为要理解bean:header标签您只要对这些内容有一个大概的认识就足够了。
accept: */*
accept-language: zh-cn
accept-encoding: gzip, deflate
user-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
host: localhost:8080
connection: Keep-Alive
下面的代码片段示例了如何使用bean:header标签读取名为User-Agent的header的值,并且使用了两种方式进行了输出:
<logic:present header="User-Agent">
您的浏览器是<bean:header name="User-Agent" id="userAgent">
</bean:header><bean:write name="userAgent">。
<%
out.println("您的浏览器是"+userAgent+"。< out.println("您的浏览器是"+userAgent+"。
");
%>
</bean:write></logic:present>
回页首
bean:include
bean:include标签对指定url(由forward、href或page确定)处的资源做一个请求,将响应数据作为一个String类型的bean绑定到page作用域,同时创建一个scripting变量。我们可以通过id值访问它们。
下面的代码片段示例了bean:include标签的用法,其中include.txt文件包含要include的内容,然后将这些内容输出:
</person><bean:include id="value" page="/include.txt">
</bean:include><bean:write name="value">
<%
out.println(value);
%> out.println(value);
%>
回页首
bean:message
bean:message标签用来从指定的locale中取回国际化的消息并输出,在这个过程中我们还可以传递五个以内的参数。message key可以通过key直接指定,也可以通过name和property间接的指定。
bean:message标签有两种指定message key的方式,一是通过key属性直接指定;二是通过name和property属性间接的指定,其中message key是在message resources文件中定义的。
我们可以在struts-config.xml文件中使用</bean:write><message-resources>来设置message resources文件。
为了介绍该标签我使用了三个message resources文件,三个文件的名字分别为Resources.properties、Resources_en.properties和Resources_zh.properties。在struts-config.xml文件中的设置(这里不用设置三个,struts会依据locale自动找到对应的文件)如下:
</message-resources><message-resources parameter="Resources">
三个message resources文件中定义的message key为:
resource=Resources.properties.
from=Resources.properties.
from=Resources_en.properties.
因为文件的编码被限制为ISO8859所以要有汉字必须用jdk的native2ascii提前转换
-->
from=Resources_zh.properties.
下面的代码片段示例了bean:message标签的用法:
</message-resources><bean:message key="from">
</bean:message><bean:message key="resource">
<html:link action="/locale?language=en">English</html:link>
<html:link action="/locale?language=zh">Chinese</html:link>
上面的代码中含有改变locale的两个html:link标签,要使它们工作您的struts-config.xml文件中必须含有下面定义的form和action:
<form-bean name="localeForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="language" type="java.lang.String">
</form-property><form-property name="country" type="java.lang.String">
</form-property><form-property name="page" type="java.lang.String" initial="/message.jsp">
</form-property></form-bean>
<action name="localeForm" scope="request" type="org.apache.struts.actions.LocaleAction" path="/locale"></action>
在不同的locale下我们得到了如下的两个结果:
在locale为zh时的结果:
Resources_zh.properties.
Resources.properties.
在locale为en时的结果:
Resources_en.properties.
Resources.properties.
让我们来看一下在locale为zh时如何得到的是上面的结果。因为locale为zh所以</bean:message><bean:message key="from">
先找Resources_zh.properties这个文件从中得到form键的值。而</bean:message><bean:message key="resource">
也会先找Resources_zh.properties这个文件但这次没有找到resource键,这时Struts会到Resources.properties这个文件中找,很幸运这里找到了。如果还没有找到,或message resource文件不存在就会抛出异常。当locale为en时类似,您可以自己试试。
回页首
bean:page
bean:page标签将页上下文中的application、config、request、response 或 session取出,然后用id属性值将它们绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了bean:page标签取出response,然后使用bean:write标签将response的characterEncoding和contentType属性输出:
</bean:message><bean:page property="response" id="res">
</bean:page><bean:write name="res" property="characterEncoding">
</bean:write><bean:write name="res" property="contentType">
<%
String characterEncoding = res.getCharacterEncoding();
String contentType = res.getContentType();
out.println(characterEncoding+"< String characterEncoding = res.getCharacterEncoding();
String contentType = res.getContentType();
out.println(characterEncoding+"
");
out.println(contentType+"
");
%>
您可以用和上面类似的代码访问application、config、request 或 session中的任何一个对象。
回页首
bean:parameter
bean:parameter标签取回请求中的参数值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的两个代码片段使用相同的url传递参数,url的形式为http://127.0.0.1:8080/struts-demo/parameter.jsp?param=1¶m=2¶m=3。前面的代码片段中没有指定multiple属性,因此p是String类型而且仅仅读取了参数的第一个值。后面的代码片段中指定了multiple属性的值,因此ps是String[]类型的包含所有参数的值。
</bean:write><bean:parameter name="param" id="p">
</bean:parameter><bean:write name="p">
</bean:write><bean:parameter name="param" id="ps" multiple="true">
<logic:iterate name="ps" id="p">
<bean:write name="p">
</bean:write></logic:iterate>
回页首
bean:resource
bean:resource标签取回指定的web应用程序的资源,以InputStream或String的形式保存到page作用域中并且创建scripting变量。采用什么形式取决于标签的input属性,如果指定input则以InputStream的形式保存,如果没有指定input则以String的形式保存。
下面的两个代码片段示例了bean:resource标签,其中resource.txt是要使用的资源文件。前面的代码片段中没有指定input属性,因此以String的形式处理资源文件,bean:write标签输出资源文件的内容。后面的代码片段中指定了input属性的值,因此以InputStream的形式使用资源文件,两个bean:write标签分别输出InputStream对象的实例名(如java.io.ByteArrayInputStream@16dadf9)和类名(如class java.io.ByteArrayInputStream)。
</bean:parameter><bean:resource name="/resource.txt" id="str">
</bean:resource><bean:write name="str">
<%
out.println(str+"< out.println(str+"
");
%>
</bean:write><bean:resource name="/resource.txt" id="is" input="true">
</bean:resource><bean:write name="is">
<bean:write name="is" property="class">
<%
out.println(is+"< out.println(is+"
");
out.println(is.getClass()+"
");
%>
回页首
bean:size
bean:size标签创建一个java.lang.Integer类型的bean,这个bean的值为该标签指定的Collection或Map中所含元素的个数。 这可以和logic:iterate标签配合使用,因为logic:iterate标签不能得到所叠代的集合的元素的个数,这有时候很不方便。
下面的代码片段示例了bean:size标签取出persons中还有元素的个数,其中listForm和persons的定义参见bean:define标签部分:
<logic:notempty name="listForm" property="persons">
<bean:size name="listForm" property="persons" id="size">
</bean:size><bean:write name="size">
</bean:write></logic:notempty>
回页首
bean:struts
bean:struts标签取回Struts的内部对象formBean、forward或mapping的值,然后用id绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了bean:struts标签取出listForm对象,让我们先来看一下listForm的定义在读代码:
private boolean one = false;
private boolean two = false;
private boolean three = false;
<html:checkbox name="checkboxForm" property="one">One</html:checkbox>
<html:checkbox name="checkboxForm" property="two">Two</html:checkbox>
<html:checkbox name="checkboxForm" property="three">Three</html:checkbox>
如果选中后被提交则相应的属性的值为true。
回页首
html:radio
html:radio标签生成一个radio。主要的用法有两种,下面我们通过代码来示例。
下面的代码示例了html:radio标签的一般用法,如果被提交则选中的radio的value值将被提交到radioForm中的id中。
<html:radio name="radioForm" property="id" value="00001">One</html:radio>
<html:radio name="radioForm" property="id" value="00002">Two</html:radio>
下面的代码示例了html:radio标签的典型用法,其中的persons和bean:define标签中的一致,您可
1、
org.springframework.orm.ObjectRetrievalFailureException: Object of class [com.xindeco.myregister.pojo.MyRegisterInfo] with identifier [14]: not found
MyRegisterInfo在数据库没有identifier [14]对象。
2、
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert="false" update="false")
出错原因:password 和repassword同时对应数据库表中的password一列,同时update和insert都设为true。
xml文件如下:
<property name="password" <br="">type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/> type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/>
<property name="repassword" <br="">type="java.lang.String"
update="false"
insert="false"
access="property"
column="password"
length = "32"
/> type="java.lang.String"
update="false"
insert="false"
access="property"
column="password"
length = "32"
/>
解决的方法:
将repassword的insert和update设为false。
3、
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed;
nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class
错误原因:hibernate的映射文件中ID是大写的,而pojo的类中id是小写的
注意事项:每个pojo的类都要继承abstractEntity,其中abstractEntity类有个ID的属性要重写
public abstract class AbstractEntity
implements Entity, BaseDTO {
abstract public long getID();
abstract public void setID(long id);
public int hashCode() {
return (int)this.getID();
}
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Entity) {
return this.getID() == ( (Entity) obj).getID();
}
return false;
}
}
4、
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
错误原因:
在application.xml文件中deleteRegister方法以delete开头,并没有被设定为可更改的,应如下设置:
<bean class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true" id="baseTxProxy">
<property name="transactionManager">
<ref bean="transactionManager">
</ref></property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="cancel*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
加上一行
<prop key="delete*">PROPAGATION_REQUIRED</prop>
5、
ERROR org.apache.struts.util.RequestUtils - Error creating form bean of class com.xindeco.business.web.form.GraAppInfoForm
public class GraAppInfoForm
extends ActionForm 错误写成
public abstratic class GraAppInfoForm
extends ActionForm
6、
2006-04-25 08:56:38,495 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@8e2fb5
java.lang.ClassCastException: $Proxy0
at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
at com.xindeco.core.web.action.BaseAction.dispatchMethod(BaseAction.java:153)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
actioin类中的newone方法如下:
public class GraAppAction
extends BaseAction {
public ActionForward newone(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
GraAppService graservice = (GraAppService) this.getBean("GraAppService");
}
applicationcontext中的GraAppService的配置如下:
<bean class="com.xindeco.business.dao.impl.GraAppDAOImpl" id="GraAppDAO">
<property name="support">
<ref local="support">
</ref></property>
<property name="sessionFactory">
<ref local="sessionFactory">
</ref></property>
</bean>
<bean id="GraAppService" parent="baseTxProxy">
<property name="target">
<bean autowire="byName" class="com.xindeco.business.service.impl.GraAppServiceImpl">
<property name="baseDAO">
<ref bean="GraAppDAO">
</ref></property>
</bean>
</property>
</bean>
因此this.getBean("GraAppService");是为了得到GraAppServicImpl类的实现。GraAppService是interface
public class GraAppServiceImpl extends BaseServiceImpl
implements GraAppService{
}
7、org.hibernate.hql.ast.QuerySyntaxException: Demand is not mapped. [from Demand where unitid = ? and needNum >usedNeedNum]
hibernate.cfg.xml没有配置Demand.hbm.xml文件的目录
8、org.springframework.jdbc.BadSqlGrammarException: Bad SQL grammar [] in task 'Hibernate operation'; nested exception is java.sql.SQLException: 列名 'id' 无效。
java.sql.SQLException: 列名 'name' 无效。
因为hibernate声明的id,name的columnid属性没有与数据库的字段对应,所以id,name无效。
9、java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:415)
at java.lang.Integer.parseInt(Integer.java:497)
at com.xindeco.business.service.impl.DemandServiceImpl.findDemandListByUnitId(DemandServiceImpl.java:33)
错误语句为
needNum = Integer.parseInt(demand.getNeedNum());
usedNeedNum = Integer.parseInt(demand.getUsedNeedNum());
因为demand.getUsedNeedNum()==null,无法转化为string 类型,
10、rg.apache.jasper.JasperException: /GraAppInfo/GraAppInfoNew.jsp(343,29) According to TLD, tag bean:write must be empty, but is not
错误的原因:
请选择 <logic:notempty name="politicsList"> <logic:iterate name="politicsList" id="politics"> </logic:iterate></logic:notempty> ? property="codeID"></bean:write><bean:write name="politics" property="codeName"> </bean:write>
就因为少了/>
以后懂得通过查找字数,来检查错误
11、2006-04-26 13:27:54,812 ERROR com.xindeco.core.util.BeanUtils - bean property [Nation] copy failed
com.xindeco.core.exception.ConvertException: org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.String; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.String
beanUtil.beanCopy(grapojo,form,BizConstants.CONVERTER);
要求:
1、pojo类的属性只有与form属性名字相同,才能beancopy成功
2、pojo中属性是实体,在form中一定要用int,long表示
出现这错误的原因是pojo中的属性不是实体,而错误写成:
string
private String nation;应改成 private Syscode nation;
12、
2006-04-26 14:38:37,843 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@fa1b2d
java.lang.NullPointerException
at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
hibernate配置文件没改,程序找不到相应的类
<many-to-one <br="">name="FSUnit"
class="com.xindeco.business.pojo.EmployUnitBaseInfo"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/> name="FSUnit"
class="com.xindeco.business.pojo.EmployUnitBaseInfo"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/>
其实FSUnit对应的类应该是FSUnit
<many-to-one <br="">name="FSUnit"
class="com.xindeco.business.pojo.FSUnit"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/> name="FSUnit"
class="com.xindeco.business.pojo.FSUnit"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="fSUnit"
/>
13、
org.hibernate.MappingException: An association from the table GraAppInfo refers to an unmapped class: com.xindeco.business.pojo.FSUnit
错误原因:hibernate.cfg.xml没有配置fsunit.hbm.xml文件的位置
14、
java.lang.ClassCastException: com.xindeco.business.dao.impl.GraAppDAOImpl
at com.xindeco.business.service.impl.GraAppServiceImpl.addGraduateApp(GraAppServiceImpl.java:16)
GraAppServiceImpl.java:16
第16行: GraAppDAO dao = (GraAppDAO) this.getBaseDAO();//其实得到的是GraAppDAOImpl
错误的原因是
public class GraAppDAOImpl
extends BaseDAOImpl {
}
没有实现GraAppDAO接口,正确的做法是
public class GraAppDAOImpl
extends BaseDAOImpl implements GraAppDAO {
}
先继承后实现
15、2006-04-27 08:38:54,078 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@1d6399b
java.lang.ClassCastException: com.xindeco.business.pojo.SysCode
at org.hibernate.type.StringType.set(StringType.java:26)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:63)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:40)
一般是因为hibernate声明类型和pojo类声明的类型不一样,并且前面已经出现了Hibernate: insert into TGraAppInfo (name, whereFrom, degree, college, speciality, studentRelTel, remark, higherEduLength, highSchool, studyResume, normalOrNot, proxyUnit, workPost, workPlace, studentAddress, studentPostNumber, nation, appStatus) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
的操作提示,查出错误的原因有:
<many-to-one <br="">name="demand"
class="com.xindeco.business.pojo.Syscode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/> name="demand"
class="com.xindeco.business.pojo.Syscode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/>
<property <br="">name="appStatus"
type="int"
update="true"
insert="true"
access="property"
column="appStatus"
length="10"
/> name="appStatus"
type="int"
update="true"
insert="true"
access="property"
column="appStatus"
length="10"
/>
应改为
<many-to-one <br="">name="demand"
class="com.xindeco.business.pojo.Demand"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/> name="demand"
class="com.xindeco.business.pojo.Demand"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="demandID"
/>
<many-to-one <br="">name="nation"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="nation"
/> name="nation"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="nation"
/>
16、
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.xindeco.business.pojo.SysCode
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:626)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)
at
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)
pojo类为:
public class GraAppInfo{
private College college;
}
action 类为
public class GraAppAction
extends BaseAction {
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
graInfo.setCollege(new College());\\必须从数据库找到college这个对象,而不能新生成
graInfo.getCollege().setID(graForm.getCollegeID());
graInfo.setAppStatus(Integer.parseInt("0"));
service.addGraduateApp(graInfo);
}
public class GraAppServiceImpl extends BaseServiceImpl
implements GraAppService{
public boolean addGraduateApp(GraAppInfo info)
{
this.getBaseDAO().save(info);
return true;
}
}
dao类save方法为
getHibernateTemplate().save(obj);
当cascade="all",插入new college 除了id和原来的记录一样,其他的字段全部都被更新,为null
当cascase=“insert”,插入new college 只会把它的id插入grainfo表中,其他字段不变。
17、java.sql.SQLException: Unable to convert between java.lang.Integer and BLOB.
因为
<property <br="">name="province"
type="com.xindeco.business.pojo.SysCode"//不能用复杂类,
update="true"
insert="true"
access="property"
column="provinceId"
/> name="province"
type="com.xindeco.business.pojo.SysCode"//不能用复杂类,
update="true"
insert="true"
access="property"
column="provinceId"
/>
应该改为
<many-to-one <br="">name="province"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="provinceId"
/> name="province"
class="com.xindeco.business.pojo.SysCode"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="provinceId"
/>
18、javax.servlet.jsp.JspException: Cannot create iterator for this collection
at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:265)
jsp文件如下:
<logic:notempty name="graduateList">
</logic:notempty><logic:iterate name="graduateList" id="graduate">
graduateList是一个类,而logic:iterator要求必须是ArrayList,HashSet....这样的集合类,而graduateList中一个属性是ArrayList或HashSet的
应改为:
</logic:iterate><logic:notempty name="graduateList" property="items">
<logic:iterate name="graduateList" property="items" id="graduate">
19、2006-05-11 17:13:37,468 ERROR com.xindeco.business.web.action.GraAppAction - com.xindeco.business.web.action.GraAppAction@bc22eb
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
SysUser user= (SysUser) request.getSession().getAttribute(WebConstants.SESSION_USER);
System.out.println(user.getRole().getRoleName());
当hibernate session取出数据放到http session时,
由于sysuser中role的lazy=“true”,所以没有将RoleName放到http session中,当System.out.println(user.getRole().getRoleName());
时,虽然http session还开着, hibernat seesion已经关闭
<many-to-one <br="">name="role"
class="com.xindeco.business.pojo.SysRole"
lazy="false"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="roleID"
/> name="role"
class="com.xindeco.business.pojo.SysRole"
lazy="false"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="roleID"
/>
20、Association references unmapped class: com.xindeco.workflow.WFNode
因为application.xml文件中没有配置<mapping resource="com/xindeco/workflow/WFNode.hbm.xml">
系统找不到WFNode
name = "nodes "
table = "WF_ROLENODES "
lazy = "true "
inverse = "false "
cascade = "none "
sort = "unsorted "
> name = "nodes "
table = "WF_ROLENODES "
lazy = "true "
inverse = "false "
cascade = "none "
sort = "unsorted "
>
<key <br="">column = "roleID "
> column = "roleID "
>
<!---->
<many <br="" many="" -="" to="">class = "com.xindeco.workflow.WFNode "
column = "nodeId "
outer - join = "auto "
/> class = "com.xindeco.workflow.WFNode "
column = "nodeId "
outer - join = "auto "
/>
<!---->
12:45 | 永久链接 | 浏览 (184) | 评论 (0) | struts |
logic:Iterator标签(以下简称“该标签”)是Struts里非常常用的一个标签,其作用在于循环显示给定容器对象中的值。
如此常用的标签,其源代码当然需要拿出来研究一下,以下列举几条研究成果:
1、该标签内部使用Collection来表示给定的容器,所有的给定容器对象(如ArrayList,Map等)都会被其转化成为Collection,Collection实际就是Map和List的父类。
2、该标签自己维护循环索引,不用程序员管理索引
3、该标签常见的几个属性如下:name、property、scope、id
对应Struts给出的Api说明如下:
name:包括要遍历Collection的Jsp页面的bean的名字(如果property没有被定义),或者是那些通过getter方法获得属性的Jsp中的Bean的名字,这些getter方法返回的是Collection(如果property定义了)。
property:在name命名的Jsp bean中定义的属性的名字,通过getter方法返回一个Collection
scope:指示到哪里去寻找name为名字的bean,如果没有定义缺省为"any scope"
id:如果Collection非空的话,在每次遍历时候Collection中每个元素的名字。
其中除了id每个元素均为Rt expr,这儿的rt expr的意思就是Run Time Expression。明确的说就是,如果你对一个Attribute的</mapping><rtexprvalue>指定为true,你就可以在这样的属性中使用<%=%>之类的东东。这个配置文件在tld中。
只有id是必须要说明的。
关于Api说明的说明:
id只是一个临时标识,在下面的<bean:write里面出现的name属性要和id一致才能打印出<bean:write的property,而此property就是在iterator中的属性。 <br="">
举例说明
以下代码生成一个阶梯状表格
系统 资源 操作
soft3
res3
opt3
soft12
res12
opt1211
soft11
res11
opt1111
在此之前传来一个request.getAttribute("userPurview"),所以有在第一个logic中的userPurview,就是在这个request里面寻找userPurview
返回的是一个list
>
<logic:iterate name="userPurview" scope="request" id="targetSys">//这个id可以随便起名,但是要注意下文使用的一致性
<logic:iterate name="targetSys" property="purviewResList" id="targetRes">
<td height="21" class="unnamed5">
<bean:write name="targetRes" property="cn">
<td height="21" class="unnamed6">
</bean:write>
<logic:iterate name="targetRes" property="purviewOprList" id="targetOpr">
<td height="21" class="unnamed4">
<td height="21" class="redzi">
<bean:write name="targetOpr" property="cn">
</bean:write>
</logic:iterate>
</logic:iterate>
</logic:iterate>
结论:
多级迭代和单层差不多,唯一注意的就是id和<bean:write中的name的对应,上级logic的id与下级logic的name对应,并且取出来的要是个collection,name和id不一定实际需要这个bean,都是虚拟的。 <br=""> 12:44 | 永久链接 | 浏览 (37) | 评论 (0) | struts |
html:form注意事项
在使用html:form时需指定action属性,特别是在使用
html标签时指定的action应在xml中找得到并且页面显示的ActionForm
应于action中使用的.do引擎相匹配,否则JSP会出错
Struts中JSP基本操作
文件头部需增加的代码
<%@ page contentType="text/html;charset=gb2312" %>
<%request.setCharacterEncoding("GB2312");%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
一般信息输出
</rtexprvalue><bean:write name="[Xml中Form-bean段的name属性]" property="[该Form-bean]成员属性">
下拉框输出
注:所有html标签(即需在form中显示的),在使用时都需在</bean:write><html:form>容器内部
<html:form action="[为处理请求的页面,如′/Hello.do′]">
<html:select property="[用于传数据的ActionForm的一个属性,该值作为默认值]">
<html:options <br="">
name="[Xml中Form-bean段的name属性]"
property="[将ActionForm的一个属性作为Option的value,该属性为Collection,]"
labelProperty="[将ActionForm的一个属性作为Option的text,该属性为Collection,]"
/> name="[Xml中Form-bean段的name属性]"
property="[将ActionForm的一个属性作为Option的value,该属性为Collection,]"
labelProperty="[将ActionForm的一个属性作为Option的text,该属性为Collection,]"
/>
</html:select>
</html:form>
逻辑叠代器使用
<logic:iterate <br="">
id="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId"
name="[Xml中Form-bean段的name属性]"
property="[Action中具为Collection属性名称]"
offset="[显示的偏移量]"
length="[显示记录数]"
> id="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId"
name="[Xml中Form-bean段的name属性]"
property="[Action中具为Collection属性名称]"
offset="[显示的偏移量]"
length="[显示记录数]"
>
<bean:write <br="">
name="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId" property="[单条记录所映射的ActionForm的属性]recordname"/> name="[自定义的代表封装单条记录标识,该标识应与bean:write中name属性相同]RecoreId" property="[单条记录所映射的ActionForm的属性]recordname"/>
</html:form></logic:iterate>
12:44 | 永久链接 | 浏览 (28) | 评论 (0) | struts |
Struts Html标签和标准的HTML标签功能相同,这里提倡在Struts应用中使用Struts标签,这是因为这些标签可以和Struts框架的其他组件紧密的联系起来,如比标签用来定义HTML表单,Struts能够把这个表单中的数据自动映射到对应的ActionForm中.下面对具体的标签进行深度研究.首先研讨一些基本的东东,我个人认为不是很常用的,生成基本HTML元素的标签,这些标签和HTML元素对应,主要包括:
1)生成元素,这个标签有一个lang属性,用于显示用户使用的语言,设置卫true的时候,标签将先根据存储当前HttpSession中的Locale对象来输出网页数用的语言,如果没有HttpSession或者里面没有Locale对象,就根据HTTP请求头的属性来输出语言,如果HTTP请求头中没有,就根据默认的Locale来输出语言.
2)生成元素,这个用于生成当前网页的绝对URL路径.如果使用了这个标签,当该网页引用同一个应用的其他网页的时候,只需要给出相对于当前网页的相对URL路径即可.
3)生成Anchor元素,这个是超连接标签,感觉有一些好处可言,比如允许在RUL中以多种方法包含请求参数.当用户浏览器关闭Cookie的时候,会自动重写URL,把SessionID作为请求参数包含在URL中,用于跟踪用户的Session状态.它的主要属性有三种,分别是forward指定全局转发连接.href指定完整的URL连接.page指定相对于当前网页的RUL.
4)生成用户请求URI,用于输出超连接中的URL部分,但它并不生成HTML
元素.URI指的是URL中的协议,主机和端口以后的内容.
5)生成HTML元素,用于在HTML页中嵌入图片.page属性指定当前的URI.
根据我个人的一些看法,感觉Struts确实很好,但是在好的东西也有一些不实用的地方,JAVA也是如此,以上方法我比较推荐标签,感觉这个标签有十分不错的功效,下面阐述一下具体的使用方法:
1) 创建全局转发连接:首先在Struts配置文件中配置
在JSP页面中引用:index
2) 创建完整URL的连接,也就是说可以连接到其他的站点
Action
3) 从一个网页连接到同一个应用的另外一个网页
Action
4) 在URL或者RUI中包含请求参数的方法
Action
5) 在URL或者URI中包含单个请求变量的方法
pagemProperty>Action
paramId属性指定请求参数名,paramName属性指定变量名称,paramProperty指定变量卫JavaBean的属性.
研讨完了StrutsHtml标签库的基本标签,下面开始研究一个重要的东东,Struts的表单标签以及它的子标签,单选按钮,复选框,下拉列表等等,下面是详细介绍:
1)表单标签的action属性来指定当用户提交表单后,处理用户请求的组件,就是说在form里action属性比如设置了一个in.do的,那么在配置文件中action元素的path属性如果是/in,这就说明是这个action来接收form提交过来的数据.这个感觉挺简单,此外还需要知道name是设置表单名字,method是来设置请求方法,比如Get或Post.
2)文本标签的property属性指定字段的名字,它和ActionForm中的一个属性匹配,这个属于表单标签的一个子标签,可以把用户填写的值提交到具体的ActionForm中
3)标签在表单中生成取消按钮,当用户按下取消按钮的时候,产生一个取消事件,这个时间由Action来捕获,至于如何处理在Action类中的execute()方法编程实现,主要用途是在用户按了提交按钮,请求没发送过去又不想提交的时候,起到一个反悔作用.
4)标签用来生成复位按钮,类似以上的取消按钮这些实现复位,取代了HTML代码.
5)标签生成提交按钮.使用方法和取消,复位一样都是这样写代码的:
提交.
6)标签在表单上生成隐藏字段,用于在表单上存放不希望让用户看到或者不允许修改的信息,它的属性类似文本标签,property和ActionForm中的具体属性对应.如果想要在表单想显示某个值,而且不希望用户修改,可以用这个方法.
7)标签在表单上生成标准的HTML检查框,比如ActionForm中的属性是boolean类型只能有2个值,就可以在表单中使用这个标签来表示.主要通过property属性来设置对应的ActionForm属性,还有一个value属性,用来设置用户选中检查框的值,默认值是true,就是说当用value=false的时候如果用户没选择这个检查框,就把ActionForm的属性设置卫true,为了检查框能够正常工作,必须在ActionForm的reset()方法中对其复位,在value属性为true的时候,必须在reset()方法中把对应的属性设置为false.
8)标签和差不多,区别就在于它可以生成复选框.它的性能比更加灵活,可以动态的决定被选中复选框的数目,只要property属性相同,而value属性不一样,就可以和ActionBean的同一个数组对应.此外checkbox只能和blooean类型的属性对应,而multibox则没有限制.
9)标签表示单选按钮,多个标签可以组合使用.
10)标签生成下拉列表或多选列表,重要的属性是size属性指定每次网页上显示的可选的项目数量.multiple属性指定是否支持多项选择,如果设置为true表示多选列表,默认为false.property属性于ActionForm中的某个属性对应,这个属性用来存储用户在列表上选中的值.在单选的情况下,ActionForm的对应属性定义为简单类型,不能是数组.在多选的情况下类型是数组.
以上是对StrutsHtml标签库的Form系列标签以及子标签的简单阐述,这些标签不一定都常用,所以了解即可,能掌握常用的几个标签就OK了.下面研究一下文件上传,是指通过用户浏览把用户本地的文件传到Web服务器标签提供了从Html表单中上传文件的功能.这个标签也是Form标签的子标签所以必须嵌套在中,而且的method属性必须设置为Post.enctype编码属性必须设置为multipart/form-data.而且它的property属性必须设置和ActionForm中的Flie类型的属性对应.如果property=”file”则ActionForm中必须要设置private File file;属性,而且提供相应的get/set方法.然后通过Action来完成接收上传文件的功能,首先创建一个读取用户上传文件的InputStream流对象,然后创建一个把上传数据写到目标文件中的OutputStream对象,接下来通过一个驯化把数据从源文件写到目标文件中,上传就实现了.
标签用于输出错误消息,在request和session范围寻找ActionMessages或者其子类ActionErrors集合对象.在从ActionMessages集合对象中读取ActionMessage对象,把ActionMessage对象包含的错误消息文本显示在网页上.至于具体的错误文本消息存放在ResourceBundle中,而且标签能识别错误文本中的HTML元素,例如等等.标签可以存放在网页的任何地方,也可以在表单内.因为它输出错误和它在网页的位置无关.它的具体属性是.1)name:指定ActionMessages对象的属性key,标签处理类根据这个key来家查request或session范围的ActionMessages集合对象.2)property:指定消息属性,如果不设置会显示ActionMessages集合对象中所有的消息对象ActionMessage.3)bundle:指定ResourceBundle如果这个没设置,将从应用中默认的ResourceBundle中获取消息.
标签和标签有些类似,也能够在网页中输出消息,具体的属性是:1)name:指定ActionMessages对象的属性key,标签处理根据这个key来检索request或者session范围内的ActionMessages对象.2)message:指定消息的来源,如果是true则从request或者session范围内检索出属性key为Globals.MESSAGE_KEY的具体的ActionMessages对象.3)id:用来命名从消息集合中检索出每个ActionMessages对象,它和标签的name属性匹配.
Struts的标签库固然很好,但是有些是需要用的,有些也是不用也罢的,所以可以根据实际情况进行研究,不过感觉还是都了解一下的好,不一定都要会用,但是起码都能看懂就OK了呵呵^_^ (网友们的支持,是我继续写技术文章的动力!)
12:43 | 永久链接 | 浏览 (51) | 评论 (0) | struts |
Struts标签
solo L
发布日期:2005年06月01日,更新日期:2005年06月01日
您使用过旅游指南吗?它总是能让我们快速的找到目的地。我对此有深刻的印象,希望这篇指南也能使您快速的完成Struts标签相关的任务。我深入细致的总结了日常使用Struts的一些经验,感觉Struts标签的用途非常广泛并且功能强大,但是学起来还是比较费时间的。我认为学习Struts标签最好的方式就是参考良好的示例,幸运的是这些示例您可以在下面找到。
Struts是Apache Jakarta的一个著名的开源项目,目标是为构建基于Java的web应用程序提供一个框架。
Struts提供了非常多的标签,依据功能和使用习惯的不同被分到了五个标签库中:
Bean Tags:该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、headers和parameters的值创建相关bean的能力。
HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。
Logic Tags:该标签库包含的标签可以用来进行逻辑判断、集合迭代和流程控制。
Nested Tags:该标签库建立在前三个标签库的基础上,具有前三个标签库的所有功能,只是允许标签间的嵌套。
Tiles Tags:该标签库包含的标签可以用来创建tiles样式的页面。
这篇指南主要介绍前三个标签库中的标签。如果您对后两类标签也感兴趣可以查阅参考资料中的Struts的用户指南。
回页首
bean:cookie
cookie最早是由Netscape公司提出来的,用来存储客户的少量状态信息。如果您对cookie的具体细节感兴趣可以查阅参考资料中的cookie spec。
bean:cookie标签取回请求中名称为name的cookie的值。如果没有指定multiple属性则依据刚取回的值创建一个Cookie类型的bean。如果指定了multiple属性则依据刚取回的值创建一个Cookie[]类型的数组。然后用id属性值将Cookie或Cookie[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了如何使用bean:cookie标签读取名为JSESSIONID的cookie的值,并且使用了两种方式进行了输出:
<logic:present cookie="JSESSIONID">
<bean:cookie name="JSESSIONID" id="jSession">
这个cookie的名称是</bean:cookie><bean:write name="jSession" property="name">,值为</bean:write><bean:write name="jSession" property="value">。
<%
String name = jSession.getName();
String value = jSession.getValue();
out.println("这个cookie的名称是"+name+",值为"+value+"。< String name = jSession.getName();
String value = jSession.getValue();
out.println("这个cookie的名称是"+name+",值为"+value+"。
");
%>
</bean:write></logic:present>
回页首
bean:define
bean:define标签在toScope(如果没有指定值就使用page作用域)指定的作用域中创建一个新属性,同时创建一个scripting变量。我们可以通过id值使用它们。新创建的属性可以由其它标签使用,而新创建的scripting变量可以由JSP脚本使用。
我们可以使用三种方式为新创建的属性和scripting变量赋值:
通过该标签的name、property和scope取回值,并且保持类型的一致性,除非取回的值为Java的原始类型,这时会使用适合的包装器类对这些值进行包装。
通过该标签的value指定值,这时新创建的属性和scripting变量的类型为java.lang.String。
通过在该标签的体中嵌入值,这时新创建的属性和scripting变量的类型为java.lang.String。
下面的代码片段示例了如何使用bean:define标签创建新属性values和新scripting变量values,它将listForm中persons的值取出来赋给values:
</logic:notempty><bean:define name="listForm" property="persons" type="java.util.List" id="values">
下面给出ListForm的代码片段以帮助您更好的理解,其中Person是一个只有id和name两个属性的简单bean:
public class ListForm extends ActionForm {
private List</bean:define><person> persons = null;
public List</person><person> getPersons() {
return persons;
}
public void setPersons(List</person><person> persons) {
this.persons = persons;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
persons = null;
}
}
下面的代码片段示例了logic:iterate标签如何使用bean:define标签创建的新属性values:
<logic:iterate name="values" id="person">
<bean:write name="person" property="id">
</bean:write></logic:iterate>
下面的代码片段示例了JSP脚本如何使用bean:define标签创建的新scripting变量values:
<%
Person p = new Person();
for(int i=0;i< Person p = new Person();
for(int i=0;i<values.size();i++){<br>
p = (Person)values.get(i);
out.println(p.getId());
out.println("
");
}
%>
回页首
bean:header
bean:header标签取回请求中名称为name的header的值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面是我的浏览器发送的header的内容,这些内容和浏览器有关,因此您的浏览器发送的内容可能和下面列出的不同。不过这没有关系,因为要理解bean:header标签您只要对这些内容有一个大概的认识就足够了。
accept: */*
accept-language: zh-cn
accept-encoding: gzip, deflate
user-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
host: localhost:8080
connection: Keep-Alive
下面的代码片段示例了如何使用bean:header标签读取名为User-Agent的header的值,并且使用了两种方式进行了输出:
<logic:present header="User-Agent">
您的浏览器是<bean:header name="User-Agent" id="userAgent">
</bean:header><bean:write name="userAgent">。
<%
out.println("您的浏览器是"+userAgent+"。< out.println("您的浏览器是"+userAgent+"。
");
%>
</bean:write></logic:present>
回页首
bean:include
bean:include标签对指定url(由forward、href或page确定)处的资源做一个请求,将响应数据作为一个String类型的bean绑定到page作用域,同时创建一个scripting变量。我们可以通过id值访问它们。
下面的代码片段示例了bean:include标签的用法,其中include.txt文件包含要include的内容,然后将这些内容输出:
</person><bean:include id="value" page="/include.txt">
</bean:include><bean:write name="value">
<%
out.println(value);
%> out.println(value);
%>
回页首
bean:message
bean:message标签用来从指定的locale中取回国际化的消息并输出,在这个过程中我们还可以传递五个以内的参数。message key可以通过key直接指定,也可以通过name和property间接的指定。
bean:message标签有两种指定message key的方式,一是通过key属性直接指定;二是通过name和property属性间接的指定,其中message key是在message resources文件中定义的。
我们可以在struts-config.xml文件中使用</bean:write><message-resources>来设置message resources文件。
为了介绍该标签我使用了三个message resources文件,三个文件的名字分别为Resources.properties、Resources_en.properties和Resources_zh.properties。在struts-config.xml文件中的设置(这里不用设置三个,struts会依据locale自动找到对应的文件)如下:
</message-resources><message-resources parameter="Resources">
三个message resources文件中定义的message key为:
resource=Resources.properties.
from=Resources.properties.
from=Resources_en.properties.
因为文件的编码被限制为ISO8859所以要有汉字必须用jdk的native2ascii提前转换
-->
from=Resources_zh.properties.
下面的代码片段示例了bean:message标签的用法:
</message-resources><bean:message key="from">
</bean:message><bean:message key="resource">
<html:link action="/locale?language=en">English</html:link>
<html:link action="/locale?language=zh">Chinese</html:link>
上面的代码中含有改变locale的两个html:link标签,要使它们工作您的struts-config.xml文件中必须含有下面定义的form和action:
<form-bean name="localeForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="language" type="java.lang.String">
</form-property><form-property name="country" type="java.lang.String">
</form-property><form-property name="page" type="java.lang.String" initial="/message.jsp">
</form-property></form-bean>
<action name="localeForm" scope="request" type="org.apache.struts.actions.LocaleAction" path="/locale"></action>
在不同的locale下我们得到了如下的两个结果:
在locale为zh时的结果:
Resources_zh.properties.
Resources.properties.
在locale为en时的结果:
Resources_en.properties.
Resources.properties.
让我们来看一下在locale为zh时如何得到的是上面的结果。因为locale为zh所以</bean:message><bean:message key="from">
先找Resources_zh.properties这个文件从中得到form键的值。而</bean:message><bean:message key="resource">
也会先找Resources_zh.properties这个文件但这次没有找到resource键,这时Struts会到Resources.properties这个文件中找,很幸运这里找到了。如果还没有找到,或message resource文件不存在就会抛出异常。当locale为en时类似,您可以自己试试。
回页首
bean:page
bean:page标签将页上下文中的application、config、request、response 或 session取出,然后用id属性值将它们绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了bean:page标签取出response,然后使用bean:write标签将response的characterEncoding和contentType属性输出:
</bean:message><bean:page property="response" id="res">
</bean:page><bean:write name="res" property="characterEncoding">
</bean:write><bean:write name="res" property="contentType">
<%
String characterEncoding = res.getCharacterEncoding();
String contentType = res.getContentType();
out.println(characterEncoding+"< String characterEncoding = res.getCharacterEncoding();
String contentType = res.getContentType();
out.println(characterEncoding+"
");
out.println(contentType+"
");
%>
您可以用和上面类似的代码访问application、config、request 或 session中的任何一个对象。
回页首
bean:parameter
bean:parameter标签取回请求中的参数值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的两个代码片段使用相同的url传递参数,url的形式为http://127.0.0.1:8080/struts-demo/parameter.jsp?param=1¶m=2¶m=3。前面的代码片段中没有指定multiple属性,因此p是String类型而且仅仅读取了参数的第一个值。后面的代码片段中指定了multiple属性的值,因此ps是String[]类型的包含所有参数的值。
</bean:write><bean:parameter name="param" id="p">
</bean:parameter><bean:write name="p">
</bean:write><bean:parameter name="param" id="ps" multiple="true">
<logic:iterate name="ps" id="p">
<bean:write name="p">
</bean:write></logic:iterate>
回页首
bean:resource
bean:resource标签取回指定的web应用程序的资源,以InputStream或String的形式保存到page作用域中并且创建scripting变量。采用什么形式取决于标签的input属性,如果指定input则以InputStream的形式保存,如果没有指定input则以String的形式保存。
下面的两个代码片段示例了bean:resource标签,其中resource.txt是要使用的资源文件。前面的代码片段中没有指定input属性,因此以String的形式处理资源文件,bean:write标签输出资源文件的内容。后面的代码片段中指定了input属性的值,因此以InputStream的形式使用资源文件,两个bean:write标签分别输出InputStream对象的实例名(如java.io.ByteArrayInputStream@16dadf9)和类名(如class java.io.ByteArrayInputStream)。
</bean:parameter><bean:resource name="/resource.txt" id="str">
</bean:resource><bean:write name="str">
<%
out.println(str+"< out.println(str+"
");
%>
</bean:write><bean:resource name="/resource.txt" id="is" input="true">
</bean:resource><bean:write name="is">
<bean:write name="is" property="class">
<%
out.println(is+"< out.println(is+"
");
out.println(is.getClass()+"
");
%>
回页首
bean:size
bean:size标签创建一个java.lang.Integer类型的bean,这个bean的值为该标签指定的Collection或Map中所含元素的个数。 这可以和logic:iterate标签配合使用,因为logic:iterate标签不能得到所叠代的集合的元素的个数,这有时候很不方便。
下面的代码片段示例了bean:size标签取出persons中还有元素的个数,其中listForm和persons的定义参见bean:define标签部分:
<logic:notempty name="listForm" property="persons">
<bean:size name="listForm" property="persons" id="size">
</bean:size><bean:write name="size">
</bean:write></logic:notempty>
回页首
bean:struts
bean:struts标签取回Struts的内部对象formBean、forward或mapping的值,然后用id绑定到page作用域中(这种绑定是为了其它标签能够使用该值),并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。
下面的代码片段示例了bean:struts标签取出listForm对象,让我们先来看一下listForm的定义在读代码:
private boolean one = false;
private boolean two = false;
private boolean three = false;
<html:checkbox name="checkboxForm" property="one">One</html:checkbox>
<html:checkbox name="checkboxForm" property="two">Two</html:checkbox>
<html:checkbox name="checkboxForm" property="three">Three</html:checkbox>
如果选中后被提交则相应的属性的值为true。
回页首
html:radio
html:radio标签生成一个radio。主要的用法有两种,下面我们通过代码来示例。
下面的代码示例了html:radio标签的一般用法,如果被提交则选中的radio的value值将被提交到radioForm中的id中。
<html:radio name="radioForm" property="id" value="00001">One</html:radio>
<html:radio name="radioForm" property="id" value="00002">Two</html:radio>
下面的代码示例了html:radio标签的典型用法,其中的persons和bean:define标签中的一致,您可
系统 | 资源 | 操作 |
<bean:write name="targetSys" property="cn">//此处name和上面id保持一致,property就是第一个list里面的元素 </bean:write> | ||
相关推荐
### Sysfader:iexplor.exe错误解决方法 #### 一、问题背景 在日常使用计算机的过程中,用户可能会遇到一个常见的问题:“sysfader:iexplor.exe”错误频繁弹出,这通常会影响到用户的正常使用体验。该错误主要...
在`3414错误解决方案.txt`文档中,可能包含了解决此特定错误的步骤和建议。通常,Sybase提供了几种方法来处理这样的问题: 1. **使用DBCC CHECKDB命令**:这是一个强大的工具,用于检查数据库的完整性和一致性。...
Oracle错误的排查通常包括以下几个步骤:记录错误代码,查阅Oracle官方文档或在线社区(如Oracle技术网络、Stack Overflow)寻找解决方案,尝试重新执行操作,如果需要,修改配置或代码,以及在必要时联系Oracle技术...
本文将详细介绍几个常见的Oracle错误码及其解决方法。 首先,错误码ORA-04014和ORA-04015涉及到创建CYCLE类型的递增或递减序列。在定义CYCLE类型的序列时,需要指定MINVALUE或MAXVALUE参数,以明确序列循环的边界。...
HTTP 500错误的原因通常涉及以下几个方面: 1. **服务器端脚本错误**:例如ASP.NET、PHP等应用程序中的编程错误。 2. **配置文件错误**:如web.config或httpd.conf等配置文件中存在语法错误或配置不当。 3. **权限...
通常,这种问题可能由以下几个原因导致: 1. **缺少官方驱动**:中兴V880的驱动程序可能没有正确安装或未被系统识别。 2. **USB调试未开启**:在设备的开发者选项中,USB调试必须开启才能使adb识别设备。 3. **USB...
通常,解决WMI错误的方法可能包括以下几个方面: 1. **重新注册WMI组件**:通过运行命令提示符并执行`wmic /unregister`和`wmic /register`命令来重新注册WMI组件。这有助于修复WMI提供程序的问题。 2. **修复WMI ...
这个错误通常意味着系统在尝试分配内存时遇到了问题,可能是由于内存不足、资源冲突或者软件自身的问题导致的。在描述中提到的“有的时候安装mapgis,但是打不开光栅文件”,这可能是因为MapGIS软件在处理光栅图像...
在处理这些错误时,通常需要根据错误的具体信息进行分析,并从以下几个方面考虑解决方案: - 确保代码逻辑正确,没有错误的类型转换或者无效的数组索引。 - 保证所有引用对象在使用前都已正确初始化。 - 避免不恰当...
根据提供的标题、描述以及部分内容,本文将详细探讨以下几个关键方面: 1. **服务器配置是否符合要求** 2. **PHP.ini配置调整** 3. **HTTPD.conf配置调整** 4. **解决304 Not Modified缓存错误** #### 1. 服务器...
根据给定的文件信息,我们可以总结出以下几个关键知识点,它们对于解决Exchange Server 2010的常见问题至关重要。 ### 1. 安装.NET Framework 3.5.1 在安装Exchange Server 2010之前,确保服务器上已安装了.NET ...
解决这个问题的方法通常有以下几点: 1. **更改Server配置**:检查Eclipse中的Server配置,确保“Server Locations”设置为“Use Tomcat installation”。这样,Eclipse将直接使用Tomcat的安装目录,而不是工作空间...
### 框架集合错误解决方案 #### 包含包冲突等常见问题 在软件开发过程中,尤其是使用多种框架和技术栈时,经常会遇到各种各样的错误和异常。本文将基于提供的内容,详细介绍几个常见的错误及其解决方案。 ### 1. ...
要解决这个问题,我们可以从以下几个方面着手: 1. **CSS调整**:检查并确保datetimepicker相关的CSS样式没有被其他样式覆盖。可能需要关注的样式有`position`(通常是`absolute`或`fixed`)、`top`、`left`、`z-...
处理这类问题通常涉及以下几个步骤: 1. **备份和恢复**: 在尝试任何修复之前,确保有最新的数据库备份。 2. **使用RMAN修复**: Oracle的恢复管理器(RMAN)可以检查和修复损坏的数据块。 3. **使用DBREPAIR_PHYSICAL...
### MEM_BAD_POINTER 错误解决办法 在软件开发与维护过程中,我们时常会遇到各种运行时错误,其中“MEM_BAD_POINTER”就是一个常见的问题。本文将详细介绍该错误的原因、可能的表现形式以及具体的解决方法。 #### ...
这个错误表示服务器遇到了一个未知的错误,无法完成请求。虽然这个错误代码本身并不提供具体的错误信息,但它是一个非常广泛的错误类别,涵盖了许多可能的原因。下面我们将详细探讨这个问题以及如何有效地解决它。 ...
Print2Flash 的 80040154 错误解决办法 Print2Flash 是一种功能强大且易于使用的 Flash 转换工具,能够将各种文件格式转换为 Flash 格式。但是,在使用 Print2Flash 时,可能会出现 80040154 错误,这是由于 COM ...
错误5172通常与数据库日志文件(.ldf)有关,可能是由于以下几种情况导致: 1. **文件损坏**:数据库文件可能由于磁盘错误、病毒感染或其他外部因素而遭到损坏。 2. **文件格式不兼容**:尝试附加的数据库文件版本...