<s:textfield name=”loginName” value=”%{#request.loginNames}”/>
使用此表达式,会生成一个文本框,并且,如果request.attribute中有loginNames属性,将会做为些文本框的默认值。
如果只使用#request.loginNames在struts2的标签内部,是不会显示任何值的,注意外面加上的%{}附号,才会被正常的使用。
如果希望如EL语言一样直接输出文件,如在一个<a></a>之间的innerHTML文本为#request.loginNames的值,我们只要使用:<s:property value=”#request.loginNames” />使可以正常使用!
注:
1.${}是EL语言的 %{}这样的形式是ognl表过式语言的,在struts2的标签内部,使用%{}这样的形式,在标签外部可以使用${}EL语言的方式。如果在struts2的标签内部使用${}这样的方式,会出现以下的错误提示:
According to TLD or attribute directive in tag file, attribute value does not accept any expressions
2.很多时候,我们使用struts2的一些标签,属性是需要接受集合的,如果集合是保存在request,session,或者是值栈(非根对象的栈顶),可以使用#变量名的方式,如果获取的值是在Action中通过特定的方法来获取,就需要使用如 value=”userList”这样的方式,只是去掉了前面的#。
今天解决了贴吧发帖的问题,可以正确的发送到正确的分类了。
随后遇到的问题是发帖完毕返回 Category.action 时候,无法读取争取的贴吧分类数据,经过在 struts.xml 里的Category.action 里的 result 后面的url加入参数,可以读取正确categoryId了
本来想在result中加入param元素而不是在url后面加 ?categoryId=0来实现,但是尝试了好久,Google和官方文档都没有什么解决方案
其中遇到的一个问题是“&”这个符号不能直接使用,需要进行转义,用“&”来替代。
最后是categoryName的问题了,本来以为很简单,却遇到了编码问题,之前从Home.action转到Category.action能正确编码,像 http://localhost:8080/PostBar/Category.action?categoryId=4&categoryName=%E9%9F%B3%E4%B9%90 ,而现在的categoryName后面却有乱码
最恨乱码问题,整整花了我将近2小时,仍然没有完美解决方法,只能勉强在PostTopic.action转到Category.action时进行Encode编码,但是这十足dirty work,而且不方便再次读取categoryName。
我尝试在struts.xml用OGNL语言进行转换,但是却无法运行,找不出问题。
实在没有办法了,现在我准备用Baidu这种url形式,只传递categoryId,而在此用Hibernate读取数据库去除categoryName来获得内容
当初之所以考虑多次传递时怕读取数据库会导致性能大幅度下降,今天又学习了一下Hibernate的缓存机制,感觉是我多虑了,二级缓存应该能大大缓解多次读取的问题。
贴吧在提交帖子时候必须提供贴吧分类id categoryId,但是怎么把这个id提交到PostAction就比较麻烦了,在jsp页面中我试了好多办法,尝试使用param和hidden(baidu用的hidden)标签,但是都不能读出cagegory.jsp页面的categoryId值。
最后我索性用试所有的表达式
<s:hidden name="topicCategoryId" value="%{#categoryId}" />
<s:hidden name="topicCategoryId" value="#categoryId" />
<s:hidden name="topicCategoryId" value="%{categoryId}" />
最后一个果然有效。。。
貌似记得这是OPGL表达式?····
晚上开始写贴吧分类,把class改成category,规避了关键字class,也显得更合理,百度的分类就是ct
然后在分类上遇到一个小问题,category_father在数据库是integer类型,可以为null,因为存在根分类,在这种情况下用Hibernate读取Category时会产生错误
在jUnit单元测试中就通不过,错误为 org.hibernate.PropertyAccessException: Null value was assigned to a property
Google后,发现Category中定义categoryFather为int类型,是不支持null的,需要改为Wrapper类Interger
有人说只需要设定setXXX和getXXX的Integer的类型和.hbm.xml文件中个Type=”java.lang.Integer”就可以了
但是经过我测试发现,categoryFather 这个成员也要定义成Interger,否则会报错 org.hibernate.PropertyAccessException: Exception occurred inside setter of …
晚上写完分类,感慨到:框架先行,功能其后,界面殿后。由于我home.jsp和category.jsp没有安排好,导致了很多问题。尽管有Eclipse的rename功能,把class改为category依然很麻烦
继续昨天的编码问题 我一直全部采用UTF-8格式,而且在jUnit测试中并没有问题,说明是在Struts进行数据收集时候出错。
Google之后,根据网上一些建议修改web.xml struts.xml 但都没有效果。
网上建议在web.xml中添加 :
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
来设定本地化和编码,然后在struts.xml中添加过滤器
<constant value="UTF-8" name="struts.i18n.encoding"></constant>
<constant value="UTF-8" name="struts.locale"></constant>
根据我测试,都没有效果。
阅读全文 »