一、项目搭建 1、Eclipse + jdk + tomcat + struts2 2、将struts2相关包添加到WEB-INF->lib目录,并在lib目录下配置web.xml 3、在src目录下配置struts2.xml,所有的Action类建立在src目录或者该目录的子目录或包中 4、整个项目后台代码分为:bean实体类层、 DAO(数据库层)、BO业务逻辑层、action层 二、struts2标签显示与否 1、自定义布局则theme="simple",如<s:form method="post" action="Login.action" theme="simple"> 2、默认布局则去掉theme="simple",此时如<s:textfield lable="用户名" name="username">,页面不会显示 "用户名" 三、Struts2如果版本高于2.1启动Tomcat很有可能出现警告或者错误信息,将strut2包中实例struts2-blank.war中的javassist-3.7.ga.jar添加到工程即可 四、报表设计 1、将Struts2解压包的lib目录下的struts2-jasperreports-plugin-2.1.6.jar插件包复制到WEB-INF的lib目录 2、jasperreports-4.0.1、iReport-4.0.1(页面设计) 二者要版本一致,这两个产品的官方网站在国内很难打开或很慢,所有建议在http://www.mirrorservice.org/mirrors,这个网站进 行搜索下载,如搜索“jasperreport”-->Directory jasperreports -->jasperreports-->多个版本的jasperreorot,下载即可;ireport下载类似。 3、将jasperreports的相关包导入lib,包括jasperreports-4.0.1.jar、iText-2.1.7.jar、groovy-all-1.7.5.jar、commons-beanutils-1.8.0.jar、commons-collections-2.1.1.jar、 commons-digester-1.7.jar、poi-3.6.jar 4、将ireport设计编译出的.jasper文件加入到Elipse项目 5、Struts的配置文件参考如下格式: <struts> <package name="repair" extends="struts-default, jasperreports-default "> <!-- 报表 导出 --> <action name="searchRepairGroupRptExp" method="execute" class="proman.actions.repair.RepairGroupRptAction"> <result name="success" type="jasper"> <param name="location">/reports/repairChartGroupRpt.jasper</param> <param name="dataSource">repairGroupReportList</param> <param name="format">XLS</param> </result> </action> </package> </struts> 其中repairGroupReportList为Action类中返回的List列表,对应.jasper设计文件上的字段 五、数据库连接池 1、从http://proxool.sourceforge.net/下载一个proxool.jar文件,解压后把两个jar包导入项目的lib目录 2、写一个单独的proxool.xml文件放到WEB-INF文件夹下,参考如下 <?xml version="1.0" encoding="UTF-8"?> <something-else-entirely> <proxool-config> <proxool> <!--datasource name ds在java代码会调用--> <alias>ds</alias> <!--url--> <driver-url>jdbc:sqlserver://192.168.1.53:1433;DatabaseName=product</driver-url> <!--driver--> <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class> <driver-properties> <property name="user" value="sa"/> <property name="password" value="111111"/> </driver-properties> <maximum-connection-count>100</maximum-connection-count> <minimum-connection-count>10</minimum-connection-count> <house-keeping-sleep-time>120000</house-keeping-sleep-time> <prototype-count>10</prototype-count> <!--test befor use it--> <test-before-use>true</test-before-use> <house-keeping-test-sql>select 1</house-keeping-test-sql> </proxool> </proxool-config> </something-else-entirely> 3、在web.xml配置如下: <servlet> <servlet-name>ServletConfigurator</servlet-name> <servlet-class> org.logicalcobwebs.proxool.configuration.ServletConfigurator </servlet-class> <init-param> <param-name>xmlFile</param-name> <param-value>WEB-INF/proxool.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 4、调用,获取Connection,代码参考如下: public static Connection getConnection(){ Connection con = null; try { //proxool驱动类 Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); con = DriverManager.getConnection("proxool.ds"); } catch (ClassNotFoundException e) { /** * 把SQLException转换为RuntimeException, * 一旦ClassNotFoundException (SQLException)被抛出, * 那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。 * 调用该方法的程序代码中也不用再捕获 RuntimeException (SQLException)异常 */ throw new RuntimeException(e); } catch (SQLException ex) { throw new RuntimeException(ex); } System.out.println("con= "+con); return con; } 六、DWR的使用(本项目中主要用于实现js访问数据库) 1、http://getahead.ltd.uk/dwr/ 下载 dwr.jar,放到WEB-INF/lib下 2、在web.xml中加入DWRServlet,如下所示: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>allowScriptTagRemoting</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> 3、写相关后台代码,参考如下: public class Hello { public String hello(String name) { return "您的第一個DWR!"; } } 4、配置dwr.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="Hello"> <param name="class" value="onlyfun.caterpillar.Hello" /> </create> </allow> </dwr> 5、页面调用 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>第一個DWR程式</title> <mce:script type='text/javascript' src="dwr/interface/Hello.js" mce_src="dwr/interface/Hello.js"></mce:script> <mce:script type='text/javascript' src="dwr/engine.js" mce_src="dwr/engine.js"></mce:script> <mce:script type='text/javascript' src="dwr/util.js" mce_src="dwr/util.js"></mce:script> <mce:script type='text/javascript' src="hello.js" mce_src="hello.js"></mce:script> </head> <body> <input id="user" type="text" /> <input type='button' value='测试' οnclick='hello();' /> <div id="result"></div> </body> </html> 6、原理 dwr/interface/Hello.js是由DWRServlet根据dwr.xml中的配置生成的,engine.js负责客户端与服务器端联系沟通,util.js是一些好用的JavaScript程式,可以让你写很多JavaScript。 hello.js是自定义的,按下按钮后,会调用的hello(): function hello() { var user = $('user').value; Hello.hello(user, callback); } function callback(msg) { DWRUtil.setValue('result', msg); } ${'user'}取得DOM物件,value取得值,然后呼叫Hello.hello(),並将value当参数传人… 结果是呼叫Server端的Hello Java类型,当返回结果后,会呼叫JavaScript的callback,DWRUtil的 setValue()方法会将传回的msg设定给指定 id的DOM!