配置SSH的一种实践方法(Spring,Struts2,Hibernate)
<spring.version>3.1.1.RELEASE</spring.version> <struts2.version>2.3.12</struts2.version> <hibernate.version>4.1.0.Final</hibernate.version>
?工程好了,就配相关的东西了。
<constant name="struts.convention.action.disableScanning" value="false"/>
? ? b.告诉strus2扫描那个包
?
<constant name="struts.convention.package.locators.basePackage" value="com.demo.action"/>
? c.?如果要踢出一些不想扫描的包
?
?
<constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>
? d.?如果你用JOBSS6,有时候你会有点伤,都照网上的配了,就是不OK,怎么办。也许下面的配置对你有用。
?
?
<constant name="struts.convention.action.fileProtocols" value="jar,vfs,vfsfile,vfszip,"/> <bean type="org.apache.struts2.convention.ActionConfigBuilder" name="myActionConfigBuilder" value="myActionConfigBuilder"/>
? ?就是JBOOS用的vfs,还有在扫描的时候好像有点问题。不知道新的解决这个问题没有。当时要写一个actionconfigbuild.有兴趣可看源代码。
?
? ?e.Struts2里要配个package.
?
<package name="basic-package" extends="tiles-default,json-default" namespace="/"> </package>
? ? ?因为项目主用到tiles和json这两种类型的result,所以继承一下。
?
public class BasicAction extends ActionSupport
? ? ?然后再所有action都继承这个
?
? ??
@Controller@Scope(BeanDefinition.SCOPE_PROTOTYPE)@Namespace(BasicAction.BASE_NAME_SPACE)public class ProductAction extends BasicAction {
? ?@Controller是spring一个annoation,我在这里先写上,因为用了spring ioc,后面配的时候再会说到。
?
?
@Action(value = "index", results = {@Result(name = SUCCESS, type = "tiles", location = ".createProduct")}) public String iniProC() throws Exception { return SUCCESS; }
?
?
2. ?Tiles 配置:
? ?上面在家可以看到type是tiles,对了,接下来配tiles.主要是tiles.xml
?
定一个基本的模板。 <definition name=".bodyCenter" template="/jsp/layout/layoutOfBody.jsp"> <put-attribute name="header" value="/jsp/layout/header.jsp"/> <put-attribute name="contentHeader" value="/jsp/layout/userheader.jsp"/> <put-attribute name="bottom" value="/jsp/layout/footer.jsp"/></definition>有时要一个简单的模板: <definition name=".simple" extends=".bodyCenter"> <put-attribute name="header" value=""/> <put-attribute name="contentHeader" value=""/> <put-attribute name="bottom" value=""/> </definition>具体实现: <definition name=".createProduct" extends=".simple"> <put-attribute name="contentBody" value="/jsp/demo/product/create.jsp"/> </definition>
?上代码吧,我还是觉得代码比文档更适合用于CODER之间的交流
?
?
?3.?验证
?
<validators> <field name=" user.nickName"> <field-validator type="required"> <message key="user.nickname"></message> </field-validator> </field></validators>
? ? ? ?b.再说一下JS客户端的配法吧
?
<constant name="struts.ui.theme" value="simple"/>
? ? ??想用客户端验证,一定不能用simple.请用其他的主题。比方说css_xhtml。因为struts要包一下input框才好后面加error message.但这功能很容易导致UI变开,我后来没用了。要是有CSS高手可能写一个一变开的主题那还是比较好的。比方说error message可以变成一个气泡谈出来之类了.总之大家慎用。
?
??????????????????????? 还要加个<s:head />,因为是JS验证嘛,这里面有好多JS会include
?
?
4.?国际化
? ?a.?文字:我想大家从资源文件读就OK了,一般问题不大,如果在JAVA里面也有相应的方法可以读取
? b.?时间时区:这个会比较坑爹一点,主要看你怎么设计了,我当时只有一台应用服务器,所以我使用的方法是,把服务器改成UTC,这样就不会有跨天的问题,session中保存一下用户的时区,每次显示或上传的时候都会根据这个时区做相应用的改变,这样整个容器里都UTC了,再也不用时区的问题心烦了
? ? 显示:
?
<tag> <description><![CDATA[Render a formatted date.]]></description> <name>date</name> <tag-class>my.utils.CalenderTag</tag-class> <body-content>empty</body-content> <attribute> <description><![CDATA[Date or DateTime format pattern]]></description> <name>format</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Deprecated. Use 'var' instead]]></description> <name>id</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[The date value to format]]></description> <name>name</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Whether to print out the date nicely]]></description> <name>nice</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[The specific timezone in which to format the date]]></description> <name>timezone</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Name used to reference the value pushed into the Value Stack]]></description> <name>var</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <dynamic-attributes>false</dynamic-attributes> </tag>
?
protected void populateParams() { super.populateParams(); Date d = (Date) component; d.setName(name); d.setFormat(format); d.setNice(nice); Float timeZoneFloat = (Float) ActionContext.getContext().getSession().get("timeZone"); if (timeZoneFloat == null) { timezone = "GMT+08:00"; } else { timezone = formatFloatToTimeZone(timeZoneFloat); } d.setTimezone(timezone);}
? ??上传,写个convert:
?
java.util.Calendar=my.utils.DateConverter
? ? 加到xwork-conversion.properties里面DateConverter里面重要的方法。
? ??
public Object convertFromString(Map context, String[] values, Class toClass) { Calendar cal = Calendar.getInstance(); Date date = null; String dateString = values[0]; DateFormat format = null; for (int i = 0; i < ACCEPT_DATE_FORMATS.length; i++) { format = ACCEPT_DATE_FORMATS[i]; try { if (i == 4) { date = new Date(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dateString.substring(0, 2))); cal.set(Calendar.MINUTE, Integer.parseInt(dateString.substring(3, dateString.length()))); Utils.changeTimeZoneForIn(cal); } else { date = format.parse(dateString); cal.setTime(date); Utils.changeTimeZoneForIn(cal); } return cal; } catch (Exception e) { continue; } } return null; }
?5。?最一差点忘记了,web.xml里面一定要配置filter和tag,就不贴了看源代码吧
?
Strut MVC 源代码
?
?
?
?
?
?
?