注意要設(shè)置,action bean 的 scope 的值。因?yàn)閟pring的bean默認(rèn)為單實(shí)例singleton,故一定要設(shè)scope的值但不能為singleton。建議設(shè)置為prototype或request
注意要設(shè)置,action bean 的 scope 的值。因?yàn)閟pring的bean默認(rèn)為單實(shí)例singleton,故一定要設(shè)scope的值但不能為singleton。建議設(shè)置為prototype或request
當(dāng)Action的valueStack中有該屬性的值時(shí),只需直接使用該屬性的名字即可;
當(dāng)Action的valueStack中沒有該屬性的值時(shí),比如在session,application范圍中的屬性值時(shí),需要加#或者#attr.;
例子:
假設(shè)某Action中有person成員變量,在application中存在company屬性
那么我們可以通過以下方法取值:
<s:property value="person.name" />
<s:property value="#person.name" />
<s:property value="company.name" /> //無法取到,因?yàn)閏ompany不在action的valueStack中
<s:property value="#company.name" />
<s:textfield name="person.name" value="person.name" /> //錯(cuò)誤,value會(huì)直接顯示person.name字樣
<s:textfield name="person.name" value="%{person.name}" />
<s:textfield name="person.company.name" value="%{#company.name}" />
<s:textfield name="person.company.name" value="%{#attr.company.name}" />
最近學(xué)習(xí)struts2是一個(gè)問題接著一個(gè)問題的遇到
剛解決了java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
接著就來最討厭的亂碼問題,我數(shù)據(jù)庫(kù)用的mysql,大家都知道mysql本省就有可能出現(xiàn)亂碼,加之現(xiàn)在跟struts2混合在一起,指不定會(huì)出現(xiàn)什么亂七八糟的編碼,這誰也說不清楚
整體思路那就是統(tǒng)一編碼(所有的內(nèi)容都采用同一個(gè)編碼)
大概從這幾個(gè)方面來排查
a) 首先確認(rèn)mysql的字符編碼,他默認(rèn)為拉丁文,這里我修改為gbk
b) 在jsp頁(yè)面中明確指明編碼類型
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%> 上面的意思是指定tomcat的編碼為gbk <meta http-equiv="Content-Type" content="text/html; charset=gbk"> 下面的意思是指定web瀏覽器的編碼為gbk |
c) 習(xí)慣性的加上spring的字符過濾器
在web.xml中添加過濾器 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>gbk</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
d) 最后別忘了在struts.xml或struts.properties中覆蓋struts2默認(rèn)國(guó)際化的編碼格式
<constant name="struts.i18n.encoding" value="gbk"></constant> |
到此編碼應(yīng)該已經(jīng)統(tǒng)一為gbk了,看看結(jié)果吧
其實(shí)最簡(jiǎn)單的放法就是把數(shù)據(jù)庫(kù)和jsp中的編碼統(tǒng)一設(shè)置為utf-8即可
今天在寫struts2 save的時(shí)候報(bào)了這么一個(gè)異常
java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:40) at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:23) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514) |
從上面的異常信息可以看出是在Hibernate進(jìn)行save的時(shí)候檢測(cè)到bean為null
1) 大致從這幾個(gè)方面來分析原因:
2) Hibernate(*.hbm.xml)映射文件是否錯(cuò)誤
3) DAO層代碼是否錯(cuò)誤
4) 檢查Action及視圖層jsp頁(yè)面等
從上面幾個(gè)逐個(gè)檢查后得出的結(jié)論為第四條
首先看Action中的代碼
private Employee employee; public Employee getEmployee() { returnemployee; } publicvoid setEmployee(Employee employee) { this.employee = employee; } |
這里employee是我們觀察的重點(diǎn)
再看jsp中的代碼
<s:form action="saveEmployee.action"> <s:textfield name="empName" label="empName"></s:textfield> <s:textfield name="age" label="age"></s:textfield> <s:textfield name="sex" label="sex"></s:textfield> <s:textfield name="context" label="context"></s:textfield> <s:submit value="注冊(cè)" theme="simple"></s:submit> <s:reset value="取消" theme="simple"></s:reset> </s:form> |
大家注意<s:textfield/>中name屬性的值
很顯然錯(cuò)誤發(fā)生在此處修改如下即可:
<s:form action="saveEmployee.action"> <s:textfield name="employee.empName" label="empName"></s:textfield> <s:textfield name="employee.age" label="age"></s:textfield> <s:textfield name="employee.sex" label="sex"></s:textfield> <s:textfield name="employee.context" label="context" value=""></s:textfield> <s:submit value="注冊(cè)" theme="simple"></s:submit> <s:reset value="取消" theme="simple"></s:reset> </s:form> |
由此我們得出的結(jié)論是:
在jsp頁(yè)面中一定要保持頁(yè)面中各個(gè)控件的name屬性與Action中模型驅(qū)動(dòng)對(duì)象的名字一致否則就會(huì)報(bào)錯(cuò)