边学边做struts1.1(eclipse)

作者:林宣武      著作权所有引用请带上作者名字
一.Java的开发环境及开发过程
1. java的开发环境:

http://www.cvshome.org cvs代码的版本控制

 window 2000
tomcat: http://www.apache.org/dist/jakarta/
jdk: http://java.sun.com/j2se/1.4.2/download.html
struts 1.2.4 :  http://www.apache.org/dist/jakarta/struts/  
2.安装过程
安装: jdk –> tomcat –>eclipse
把 tomcatv3Plugin解压到 eclipse目录中
cvs , eclipse 连接
常见问题
3.开发过程
(一)详细的步骤
1.启动eclipse 并建立一个java Project (teststruts)
并在其下建立一个如下目录结构:
src(source Folder) 当前项目私用内容(如action 及不可以被其他项目公用的部份)
web(Folder) 当前项目的页面显示内容      (是tomcat 的web root path)
    必须包括WEB-INF 及其下的 lib ,classes目录
TUtil(source Folder)    通用功能模块:可以被其他的项目录再调用
TStruts(source Folder)   本项目的struts中的 扩展模块, 扩展了struts中的框架内容
OtherSrc(source Folder) 本项目中用到的lib包的中源代码, 可以用于提高开发速度
        ,和生成javadoc的作用(struts-1.2.4-src, jdk-src……)
Test(source Folder)     junit 的测试内容

 

可建一个doc project这样的可以把所有的 文档在一起了
把 struts-lib包内容拷到 /web/WEB-INF/lib中
2.为project -> properties
a. tomcat context name: /teststruts  web application root: /web                          
    b.java build path
(a.     Libraries-> add jars -> 把/web/WEB-INF/lib中的jar 全加入列表中
(b.    Libraries-> add Extend jars -> 把 tomcat 下的 comom/lib/servlet.jar加入
(c.    Default out folder : teststruts/web/WEB-INF/classes
 (3..struts 1.2.4 class 增加 src中的内容 方法: 在查看class内容时有一个 add source 按钮
 (4. 增加 web.xml struts-config.xml

          web.xml内容:

    <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

                         "http://java.sun.com/dtd/web-app_2_3.dtd">   

 <web-app>

  <servlet>

    <servlet-name>action</servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <init-param>

      <param-name>config</param-name>

      <param-value>/WEB-INF/struts-config.xml</param-value>

    </init-param>

    <init-param>

      <param-name>debug</param-name>

      <param-value>2</param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

 </servlet>

 <servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

 </servlet-mapping> 

     <welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

        <taglib>

        <taglib-uri>struts-bean</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-bean.tld</taglib-location>

    </taglib>

    <taglib>

        <taglib-uri>struts-html</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-html.tld</taglib-location>

    </taglib>

    <taglib>

        <taglib-uri>struts-logic</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-logic.tld</taglib-location>

    </taglib>

    <taglib>

        <taglib-uri>struts-nested</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-nested.tld</taglib-location>

    </taglib>

    <taglib>

        <taglib-uri>struts-tiles</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-tiles.tld</taglib-location>

    </taglib>

    <taglib>

        <taglib-uri>struts-validator</taglib-uri>

        <taglib-location>/WEB-INF/lib/struts-html.tld</taglib-location>

    </taglib>

        <taglib>

       <taglib-uri>html-self</taglib-uri>

        <taglib-location>/WEB-INF/lib/html-self.tld</taglib-location>

    </taglib>        

</web-app> 

        struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

                               "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

    <form-beans>    

    </form-beans>

    <global-forwards>

        <forward contextRelative="true" name="Login" path="/login.goto.do" redirect="false"/>

        <forward contextRelative="true" name="Message" path="/message.jsp" redirect="false"/>

    </global-forwards> 

    <action-mappings>

        <action path="/login" type="com.lxw.action.LoginAction" name="userForm" input="/user/login.jsp"/>

    </action-mappings>

     <message-resources parameter="com.lxw.struts.ApplicationResources"/>

</struts-config>

(5.增加 action , 并在struts-config.xml增加记录

( struts-config.xml

 a. form-beans记录

    <form-bean name="userForm" type="org.apache.struts.action.DynaActionForm">

         <form-property name="username" type="java.lang.String"/>

            <form-property name="password" type="java.lang.String"/>    

    </form-bean>

 b.global-forwards

         <forward contextRelative="true" name="Login" path="/login.goto.do" redirect="false"/>

c. action-mappings

 直接转向

   写法一:   <action path="/login.goto" type="org.apache.struts.actions.ForwardAction" parameter="/user/login.jsp"/>

  写法二: <action path="/login.goto" forward="/user/login.jsp"/>  

  登陆动作  

<action path="/login" type="com.lxw.action.LoginAction" name="userForm" input="/user/login.jsp"/>

 

注意点:

input的作用 可通过mapping.getInputForward()获得

forward的作用 可通过mapping.findForward(“Login”)

DynaActionForm可以不用实现对应的actionForm调用时直接调用

 

dyform.get(“username”) dyform.set(“username”,”me”)

 

  

(二.增加LoginAction.javalogin.jsp

 

(二)常见的错误:
   安装过程,把
1 在增加web.xml 以前,简单jsp 可以显示,当增加了web.xml后就出现错误
错误类似:说明此web.xml有误

 type Status report

message /teststruts/index.jsp

description The requested resource (/teststruts/index.jsp) is not available.

  常见的是如下web.xml内容, 在struts的早期版本中struts-template.tld

 但在 struts1.2.4中就没有了,所以当我们还是原来的内容时就会出错,

解决:删除此内容 ( 重启 tomcat)

    <taglib>

        <taglib-uri>struts-template</taglib-uri>        <taglib-location>/WEB-INF/lib/struts-template.tld</taglib-location>

</taglib>

2.页面中文乱码问题:
 解决: 增加<%@ page contentType = "text/html;charset=gb2312" %>
(3.

 

二. 开发主题:
1.建立自已的标签:
 为什么要增加:
如当我们用 < a href=”/login.goto.do”>登陆</a> 而tomcat中<Conext path = “/teststruts” 要正常显示必须
而上面的超链接点击后显示为: http://localhost:8080/login.goto.do
 现在我们要增加一个标签: 目的--为超链接增加 http://localhost:8080/tetstruts
(1.增加一个tld文件/WEB-INF/lib/html-self.tld内容:

 

 <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>htmlsf</shortname>

<uri>http://struts.apache.org/tags-html</uri>

<tag>

<name>cp</name>

<tagclass>com.lxw.tag.ContextPathTag</tagclass>

</tag>

</taglib>
(2.实现com.lxw.tag.ContextPathTag 内容:

   public class ContextPathTag extends TagSupport {

    protected static MessageResources messages =

        MessageResources.getMessageResources(Constants.Package + ".LocalStrings");

    public int doStartTag() throws JspException {

        HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();

       String baseTag= request.getContextPath();

 

        JspWriter out = pageContext.getOut();

        try {

            out.write(baseTag);

        } catch (IOException e) {

            pageContext.setAttribute(Globals.EXCEPTION_KEY, e, PageContext.REQUEST_SCOPE);

            throw new JspException(messages.getMessage("common.io", e.toString()));

        }       

        return EVAL_BODY_INCLUDE;

    }

}
(3.调用方法

 a. web.xml中增加内容

    </taglib>

        <taglib>

        <taglib-uri>html-self</taglib-uri>

        <taglib-location>/WEB-INF/lib/html-self.tld</taglib-location>

</taglib>

b.在要调用的页面中增加

 <%@ taglib uri="html-self" prefix = "htmlsf" %>

调用

<a href="<htmlsf:cp/>/login.do"> 登陆 </a> 

2.多国语言的处理
http://dev.csdn.net/develop/article/42/42897.shtm 用struts框架尝试国际化程序实现
出错提示:
 (1. 在struts-config.xml中增加
 <message-resources parameter="com.lxw.struts.ApplicationResources"/>

注:如果放在WEB-INF/classes 下就没有必要声明

(2.    增加ApplicationResources_zh_CN.native 文件 内容如下
# ================prompt in jsp page ===================
login.jsp.title= 登陆 titlecn
login.jsp.page.heading= 登陆 headingcn
login.jsp.prompt.username= 用户名
login.jsp.prompt.password= 密码
login.jsp.prompt.submit= 提交验证
login.jsp.prompt.reset= 重新填写

 

#==================error=========
id={0}
error.detail={0}
(3.    生成ApplicationResources_zh_CN.properties 文件
   jdk/bin下有 native2ascii.exe 最后设置环境变量 path    内容 …jdk/bin
   就可以用native2ascii -encoding GBK ApplicationResources_zh_CN.native
ApplicationResources_zh_CN.properties 
生 成
(4.    页面上调用
    <%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
调用方法:
<bean:message key="login.jsp.title"/>
<html:submit><bean:message key="login.jsp.prompt.submit"/></html:submit>
(5.    测试方法
打开IE 的“ 工具”->“Internet 选项” 菜单,“ 常规” 选项卡,点击其中的“ 语言” 按钮,添加“ 英语( 美国)-[en-us]” 语言,将其他的语言删除,重新启动IE 后, 你会发现内容已经变成英文;  
常见错误:
(1). org.apache.jasper.JasperException: Cannot find message resources under key org.apache.struts.action.MESSAGE
 请在struts-config.xml中增加
     <message-resources parameter="com.lxw.struts.ApplicationResources"/>    
(2).org.apache.jasper.JasperException: Missing message for key "logon.jsp.title"
 请确认<message-resources parameter="com.lxw.struts.ApplicationResources"/>包写对了  
3.多模块独立开发

 

我们查看一下,struts1.2.4 自带的多模块的文件组成结构:
模块 upload,validator,exercise 三个目录, 根目录放着 upload,validator,exercise及其中jsp页面. 还有 WEB-INF 其中放 upload,validator,exercise及他们的struts-config.xml 配置代码放在一起
我们现在要做的是独立处理各模块的情况:

 

web.xml中处理:
 <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-organization.xml,/WEB-INF/struts-config-doc.xml,/WEB-INF/struts-config-product.xml,/WEB-INF/struts-config-right.xml, /WEB-INF/struts-config-log.xml,/WEB-INF/struts-config-print.xml</param-value>
   </init-param>
    <load-on-startup>2</load-on-startup>
 </servlet>

 

开发时处理: 可以一个开发模块一个xml文件

 

jbuilder 的处理:
多模块共同开发—分多模块(业务之间耦合小的模块,分为业务层,页面层,)
 + 通用的模块内容 +   一般的规化: 每个人一个业务层模块,同时负责对应的页面模块的调用.
  如果采用DAO,那就必须要
如果是jbuilder 可以多个jpx 同时建一个工程组
4.页面安全

 

5.文件上传

(1.    中增加  struts-config.xml

   <form-beanname="uploadForm" type="org.apache.struts.action.DynaActionForm">
         <form-property name="upfile" type="org.apache.struts.upload.FormFile"/>
 </form-bean>

 

<action path="/upload.goto" forward="/upload/upload.jsp"/>
    <action path="/upload" type="com.lxw.action.UploadAction" name="uploadForm" input="/upload/upload.jsp"/>   

 <controller maxFileSize="2M" inputForward="true" />

 (2增加UploadAction.java
DynaActionForm dyForm= (DynaActionForm)form;
        FormFile upFile=(FormFile)dyForm.get("upfile");
        OutputStream bos = new FileOutputStream("d:/houseUpload/"+upFile.getFileName());
        bos.write(upFile.getFileData());
        bos.close();

 

(3.    增加jsp

<html:form action="/upload.do" enctype="multipart/form-data" >
file: <html:file   property="upfile" /> 
 <html:submit> 上传 </html:submit>
</html:form>

 

6.日志处理

 

请参考
采用log4j 进行日志记录:
(1.       建立log4j.xml放于WEB-INF/classes下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender class="org.apache.log4j.ConsoleAppender" name="STDOUT">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%t] %-5p (%c{1}.%M:%L) - %m%n"/>
        </layout>
    </appender>
    <category name="org.apache">
        <priority value="WARN"/>
    </category>   
    <root>
        <priority value="DEBUG"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>
(2.       引入log4j包于libraries中

 

(3.       在要增加日志记录的包内容调用
    protected Log log = LogFactory.getLog(LoginAction.class);
    log.debug("ttttttttttttt");
7.权限控制
一.通过Filter 来判断
 1. 配置 web.xml
<web-app>
   <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>syd.insur.was.struts.struts.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>GB2312</param-value>
    </init-param>
    <init-param>
      <param-name>ignore</param-name>
      <param-value>true</param-value>
    </init-param>
 </filter>
 <filter>
    <filter-name>checkRightFilter</filter-name>
    <filter-class>syd.insur.was.right.filters.checkRightFilter</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
 </filter-mapping>
 <filter-mapping>
    <filter-name>checkRightFilter</filter-name>
    <url-pattern>*.do</url-pattern>
 </filter-mapping>

 

 

8.数据库处理
public void testdb(){
    Connection conn = null;
    Statement mystat=null;
    try {
      DriverManager.registerDriver( (java.sql.Driver) Class.forName(
          "oracle.jdbc.driver.OracleDriver").newInstance());
      //Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.107:1521:padb","painsure","pamanager");
     Connection conn = DriverManager.getConnection(
          "jdbc:oracle:thin:@172.16.3.107:1521:padb", "painsure", "pamanager");
      int i = 0;
      ResultSet rs = null;
     Statement mystat = conn.createStatement();
      //mystat.executeUpdate( "update sql");
      rs=mystat.executeQuery("select 1 from dual");
      if(rs.next())
              {
                 int iresult=rs.getInt(1);
              }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }finally{
      try{
      if(mystat!=null)mystat.close();
       if(conn!=null)conn.close();
      }catch(Exception ex){
        ex.printStackTrace();
      }
}
注意:
1.调用Statement及Connection及PraparedStatement 都要注意及时的关闭,最好放于finally中保证在函数不论是有Exception时还是其他原因都能及时关闭
2.常见的错误:
(1.                             ResultSet 必须要next()后才能getString()等获得对应的内容,同时ResultSet 也要及时关闭.
 
要点:
尽量多的使用PreparedStatement,同时有尽量多的使用clearBath();addBath();
executeBath() 批处理,但是不要把只查询一次及只更新一次等更新或查询很少的
Satement写成 PreparedStatement 这样
9.分页处理
/**
 * <p>Title: 大容量数据的查询的分页,针对数据库为oracle </p>
 * <p>Description:
 * 好处:
 * (1. 不用每个模块都要一个session 范围的变量,来保存相关查询结果集.所有的分页只要用一个page变量就可以,
 *     即减少了内存的使用
 * (2. 采用sql 只查询出指定的数据结果集,可以增加系统的处理速度
 * (3. 把相关的内容封装到此类中可以减少写重复代码 及减少程序复杂度
 *
 * 注:只针对oracle数据库
 * 调用方法: 最好每个用户只用一个javaBean(session范围)也就是session.setAttribute("page",page);
 * 调用前请初始化:initPage</p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author 林宣武
 * @version 1.0
 */

 

public class PageManageBean {
 private int iCurPage = -1;
 private java.util.Vector vCurPage; //当前页//当前要显示的页的内容
 private String strSql=null;//当前用的查询sql
 private int iPageSize=-1;//当前页的最大记录数
 private String strError=null;//出错内容
 private int iSumPages=-1;//总页数:初始化时获得
 private int iSumRecords=-1;//总记录数
 private Object objIn = null;// 传入有用的参数
 private String rsToVectorType =null;// 把resultSet 转为 Vector的所调用的函数
 /*
   @作用:刚进来时必须要初始化页面
   @参数:sqlIn 查询页的sql; iInitPageIn 查询的页码 ; iPageSizeIn 查询的页的记录数
   @返回值:
      成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
      失败为false ,并且有strError信息,可通过 getErrMsg()获得
*/
 public boolean initPage(String sqlIn, int iInitPageIn, int iPageSizeIn, Object objIn,String rsToVType){
   try{
     //判断
     if(iInitPageIn <1) throw new Exception("所选要显示页码错误, 必须>=1");
     if(iPageSizeIn <1) throw new Exception("所选的页最大记录数出错,必须要>=1");
     if(rsToVType==null || rsToVType.equals("")) throw new Exception("查询出错,必须要选择输出类型");
     //初始化数据变量
     this.objIn = objIn;
     strSql = sqlIn;
     iPageSize = iPageSizeIn;
     iCurPage = iInitPageIn;
     iSumPages = querySumPages(sqlIn,iPageSizeIn);
     rsToVectorType = rsToVType;
     //获得对应的页内容
     // lxw 20041111 vCurPage = queryPage(sqlIn, iInitPageIn, iPageSizeIn);
   }catch(Exception ex){
       strError = "初始化页面出错,具体错误:" + ex.getMessage();
      return false;
   }
    return true;
 }

 

 //获得总页数
 public int getISumPages() {
    return this.iSumPages;
 }

 

 //获得当前页
 public int getICurPage() {
    return this.iCurPage;
 }

 

 //作用:获得当前页的内容 注:最后一列为rownum(此次查询的rownum)
 //调用方法:
 public java.util.Vector getCurPageVector()
 {
      return this.vCurPage;
 }
/*
 @作用:取下一页面
 @参数:
 @返回值:
    成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
    失败为false ,并且有strError信息,可通过 getErrMsg()获得
*/
 public boolean nextPage() {
    //判断
    if(iCurPage>= iSumPages)
    {
      strError = "已到最后一页";
      return false;
    }
    //获得页面内容
    try {
      iCurPage =iCurPage + 1;
      vCurPage = queryPage(strSql, iCurPage, iPageSize);
    }
    catch (Exception ex) {
       strError = "取下一页出错,具体内容" + ex.getMessage();
      return false;
    }

 

    return true;
 }
 /*
   @作用:取上一页面
   @参数:
   @返回值:
      成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
      失败为false ,并且有strError信息,可通过 getErrMsg()获得
 */
 public boolean prePage() {
    //判断
    if(iCurPage<=1)
    {
      strError = "已到第一页";
      return false;
    }
    //获得页面内容
    try {
      iCurPage = iCurPage -1;
      vCurPage = queryPage(strSql, iCurPage, iPageSize);
    }
    catch (Exception ex) {
      strError = "取上一页出错,具体内容" + ex.getMessage();
      return false;
    }
    return true;
 }
 /*
   @作用:取最后一页面
   @参数:
   @返回值:
      成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
      失败为false ,并且有strError信息,可通过 getErrMsg()获得
 */
 public boolean lastPage() {

 

    //获得页面内容
    try {
      iCurPage = iSumPages;
      vCurPage = queryPage(strSql, iCurPage, iPageSize);
    }
    catch (Exception ex) {
      strError = "取最后一页面出错,具体内容" + ex.getMessage();
      return false;
    }

 

    return true;

 

 }

 

 /*
 @作用:取第一页面
 @参数:
 @返回值:
     成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
     失败为false ,并且有strError信息,可通过 getErrMsg()获得
 */
 public boolean firstPage() {
    //获得页面内容
    try {
      iCurPage = 1;
      vCurPage = queryPage(strSql, iCurPage, iPageSize);
    }
    catch (Exception ex) {
      strError = "取第一页面,具体内容" + ex.getMessage();
      return false;
    }
    return true;
 }

 

 /*
 @作用:获得出错的信息
 @参数:
 @返回值:
       出错信息 String
 */
 public String getErrMsg() {
    return strError;
 }

 

 /*
 @作用:跳到某一页
 @参数:
 @返回值:
    成功true , 可通过getAryLstCurPage() 获得页面要显示的内容
     失败为false ,并且有strError信息,可通过 getErrMsg()获得
 */
 public boolean gotoPage(int iJumpPage){
    //判断
    if (iJumpPage < 1 || iJumpPage >iSumPages ) {
      strError = "跳到某一页出错,目的页码必须大于或等于1";
      return false;
    }
    //获得页面内容
    try {
      iCurPage = iJumpPage;
      vCurPage = queryPage(strSql, iCurPage, iPageSize);
    }
    catch (Exception ex) {
      strError = "取上一页出错,具体内容" + ex.getMessage();
      return false;
    }
    return true;
 }

 

 //获得总记录数
 private int querySumPages(String sqlIn, int iPageSizeIn) throws Exception {
    //判断
    if (sqlIn == null || sqlIn.equals("")) {
      throw new Exception("总页数查询的sql有误");
    }
    int iRet=0;
    String dbSql="";
    Connection conn = null;
    Statement st = null;
    ResultSet rs = null;
   try{
     //这里请大家用你们的数据库连接
     DataSource ds= getMyDataSource();
     conn = ds.getConnection();

 

     dbSql = getSqlRecordCount(sqlIn);
     st =conn.createStatement();
     rs=st.executeQuery(dbSql);
      if(rs.next())
         iSumRecords = rs.getInt(1);
      rs.close();

 

      if(iSumRecords!=0)
      {
        iRet = iSumRecords / iPageSizeIn;
        if( (iSumRecords % iPageSizeIn )>0)
          iRet = iRet + 1;
      }
   }
   catch(Exception ex)
  {

 

     throw new Exception("计算总页数时出错,错误信息:"+ ex.getMessage());
   }
   finally {
      try{
        if (conn != null) conn.close();
        if (st != null) st.close();
        if (rs != null) rs.close();
      }
      catch (Exception e) {
          e.printStackTrace();
      }
   }
    return iRet;
 }

 

 //作用:查询对应页的内容
 //返回ArrayList(ArrayList)
 private java.util.Vector queryPage(String sqlIn, int iCurPageIn, int iPageSizeIn) throws Exception {
    //判断
    if (sqlIn == null || sqlIn.equals("")) {
      throw new Exception("分页查询的sql有误");
    }
    java.util.Vector vRet = new java.util.Vector();
    Connection conn = null;
    PreparedStatement pm = null;
    ResultSet rs = null;
    try {
      String dbSql = "";
      dbSql = getSqlPage(sqlIn);

 

      //这里请大家用你们的数据库连接
      DataSource ds= getMyDataSource();
      conn = ds.getConnection();

 

      int iBegin=(iCurPageIn-1) * iPageSizeIn;
      int iEnd = iBegin + iPageSizeIn ;

 

      pm = conn.prepareStatement(dbSql);

 

      pm.setInt(1,iEnd);   //从第几行结束
      pm.setInt(2,iBegin); //从第几行开始
      rs = pm.executeQuery();
      if(rs!=null)
        vRet= Helper.rsToVector(rs,objIn,rsToVectorType);
      rs.close();
    }
    catch (Exception ex) {
      throw new Exception("更新页面时出错,错误信息:" + ex.getMessage());
    }
    finally {
       try{
         if (conn != null) conn.close();
         if (pm != null) pm.close();
         if (rs != null) rs.close();
       }
       catch (Exception e) {
           e.printStackTrace();
       }
    }

 

    return vRet;
 }
 //采用通用分页sql方法,支持order by,注意在sql中不要用别名
 private String getSqlPage(String sqlIn) throws Exception {
    try{
      StringBuffer pagingSelect = new StringBuffer(1000);
      pagingSelect.append(
          "select * from ( select row_.*, rownum rownum_ from ( ");
      pagingSelect.append(sqlIn);
      pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
      return pagingSelect.toString();
    }
    catch(Exception ex){
      throw new Exception("执行getSqlPage函数出错!错误信息:" + ex.getMessage() );
    }
 }
 //获得总记录数sql
 private String getSqlRecordCount(String sqlIn)
 {
    StringBuffer pagingSelect = new StringBuffer(100);
    pagingSelect.append("select count(*) from ( ");
    pagingSelect.append(sqlIn);
    pagingSelect.append(" ) ");
    return pagingSelect.toString();
 }
 //获得所有的记录
 public java.util.Vector getAllPage(String sqlIn) throws Exception {
    java.util.Vector vRet = new java.util.Vector();
    Connection conn = null;
    Statement st = null;
    ResultSet rs = null;
    try
     {
      DataSource ds= getMyDataSource();
      conn = ds.getConnection();
      st = conn.createStatement();
      rs = st.executeQuery(sqlIn);
      if(rs!=null)
       vRet= Helper.rsToVector(rs,objIn,rsToVectorType);
      rs.close();
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
      try {
        if (conn != null)
          conn.close();
        if (st != null)
          st.close();
      }
      catch (Exception e) {
      }
    }
    return vRet;
 }
 public java.lang.Object getObjPara() {
     return objIn;
 }
 public java.lang.String getCurSql() {
    return strSql;
 }
 //清空原来的分页内容
 public void clearPage() {
    strSql = null;
    iPageSize = 0;
    iCurPage = 0;
    iSumPages = 0;
    strError=null;
    if(vCurPage!=null)
      vCurPage.removeAllElements();
 }
 //获得总记录数
 public int getISumRecords() {
    return iSumRecords;
 }

 

}
10.xml操作(jdom)
读取xml
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(path);
        Element rootE = doc.getRootElement();
        List rootL = rootE.getChildren();
        Iterator rootItr = rootL.iterator();
        //获取EJB
        while (rootItr.hasNext()) {
          Element busiE = (Element) rootItr.next();
          String tcontent=busiE.getChildTextTrim("字段一");
           }
写入xml
     //把xml的内容输出到指定的目录
 public boolean outputxml(Document doc,String filePath){
      try{
        XMLOutputter xout = new XMLOutputter();
        xout.setEncoding("gb2312");
        java.io.FileOutputStream fileout = new java.io.FileOutputStream(filePath);
        xout.output(doc,fileout);
      }catch(Exception e){
         e.printStackTrace();
      }
     return true;
 }

 

注意:

 

11.页面验证

 

12.定时器
 (1. GobalTimerServlet.java文件主要内容
public class GobalTimerServlet extends HttpServlet implements ServletContextListener {
 //Notification that the web application is ready to process requests
 private java.util.Timer timer = null;

 

 public void contextInitialized(ServletContextEvent scEvent) { 

 

      timer = new java.util.Timer(true);
      //每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟 60*60*1000
      timer.schedule(new MyTask(scEvent.getServletContext()), 0, 60 * 60 * 1000);    
 }
 //Notification that the servlet context is about to be shut down
 //只有要整个web的生命期才有效
 public void contextDestroyed(ServletContextEvent sce) {
        System.gc();
    timer.cancel();
 }
}

 

(2. MyTask 文件主要内容 (注 SendEmailLog 改为你们自已的log)
//定时的任务内容
public class MyTask extends TimerTask{

 

 private static final int C_SCHEDULE_HOUR = 0; //表示天中的几点钟启动
 private static boolean isRunning = false;
 private ServletContext context = null;
 public MyTask(ServletContext context) {
    this.context = context;//以后用
 }
 //主要的执行内容
 public void run() {
    Calendar cal = Calendar.getInstance();
    if (!isRunning) {
      if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
        isRunning = true;
         SendEmailLog.Log("定时器开始执行指定任务");
        MyMail myMail=new MyMail();
        myMail.autoSendInfoMail();
        //TODO 添加自定义的详细任务,以下只是示例
        RunLogService.Log("已完成任务");
        isRunning = false;
         SendEmailLog.Log("指定任务执行结束");
      }
    }
    else {
      SendEmailLog.Log("上一次任务执行还未结束");
    }
 }
}
(3. Web.xml配置 增加
<listener>
    <listener-class>PA.Dangan.Manage.util.GobalTimerServlet</listener-class>
 </listener>
 <servlet>
    <servlet-name>GobalTimerServlet</servlet-name>
    <servlet-class>pa.dangan.manage.util.GobalTimerServlet</servlet-class>
 </servlet>
13. email操作 (weblogic中)
(1. java内容
/*
     * @function sendMail   发送邮件
     * @param     String mailTitle 邮件的主题
     * @param     String mailContent 邮件的内容
     * @param    String mailTo 邮件的目的(目的email地址)
     * @return    boolean 成功返回 true 失败返回 false
     */
    private boolean sendMail(String mailTitle, String mailContent, String mailTo) throws Exception {
      boolean boolReturn = false;
      try {
        InitialContext ic = new InitialContext();
        javax.mail.Session mailSession = (javax.mail.Session) ic.lookup("mymail");
        //实例化Message
        javax.mail.Message mailMsg = new javax.mail.internet.MimeMessage(mailSession);
        mailMsg.setFrom();
        mailMsg.setRecipients(Message.RecipientType.TO,
                              javax.mail.internet.InternetAddress.parse(mailTo, false));
        mailMsg.setSubject(mailTitle);
        mailMsg.setSentDate(new Date());
        javax.mail.internet.MimeBodyPart mbp = new javax.mail.internet.MimeBodyPart();
        mbp.setText(mailContent);
        javax.mail.internet.MimeMultipart mp = new javax.mail.internet.MimeMultipart();
        mp.addBodyPart(mbp);
        mailMsg.setContent(mp);
        //实现发送
        javax.mail.Transport.send(mailMsg);
        boolReturn = true;
      }
      catch (Exception ex) {
        throw new Exception(ex);
      }
      return boolReturn;
}
(2.    配置Mail Session:

JNDIName::mymail   必须

Properties:

mail.smtp.user=lxw

mail.from=lxw@sohu..com

mail.transport.protocol=smtp

mail.host=home.sohu.com

 

14. ejb操作
调用ejb:
      properties = new Properties();
      //properties.put("javax.rmi.CORBA.PortableRemoteObjectClass","weblogic.iiop.PortableRemoteObjectDelegateImpl");
      properties.put(Context.INITIAL_CONTEXT_FACTORY,
                     "weblogic.jndi.WLInitialContextFactory");
      properties.put(Context.PROVIDER_URL, url);
      properties.put(Context.SECURITY_PRINCIPAL, user);
      properties.put(Context.SECURITY_CREDENTIALS,
                     password == null ? "" : password);
Context ctx = new InitialContext(properties);
 Object ref = ctx.lookup("OperManage");
     OperManageHome opmHome = (OperManageHome) PortableRemoteObject.narrow(ref, OperManageHome.class);
     OperManage opm = (OperManage) opmHome.create();

 

15. 重复提交
  
16.测试
 分为单元测试,集成测试,功能测试,性能测试
1.       单元测试:
可采用 TestCase :进行单元测试(jbuilder 中) 一般如果要求比较严格的话是每一个
一个TestCase 不严格就用每一个DAO /Proxy 一个TestCase
2.       性能测试:
LoadRunner进行测试 ,
 

 

17.报表输出:pdf

 

18.报表输出excel
有开发包: JavaExcelApi , POI-HSSF
POI-HSSF 开发的方向就是可以处理word,excel的生成读写
JAVA EXCEL API当时是仅用于读excel而开发的

 

开发包下载:
POI-HSSF: http://jakarta.apache.org
JavaExcelApi: http://www.andykhan.com/

 

现针对 POI-HSSF 做一下简介

 

获得模板:

       public InputStream getTemplate(String filename){
                 InputStream configfile = null;
                 try{
                 java.lang.reflect.Method getCCL = Thread.class.getMethod("getContextClassLoader", new Class[0]);
                 if (getCCL != null) {
                     ClassLoader contextClassLoader =
                         (ClassLoader)getCCL.invoke(Thread.currentThread(),new Object[0]);
                     configfile = contextClassLoader.getResourceAsStream("syd/insur/hyx/report/template/"+filename);
                 }
                 }catch(Exception e){

 

                 }
         return configfile;
         }

 

 

 public void generateReport(Report data, OutputStream out) throws IOException{
            POIFSFileSystem fs = new POIFSFileSystem(getTemplate(data.getTemplate()));
            HSSFWorkbook wb = new HSSFWorkbook(fs);
            HSSFSheet sheet = wb.getSheetAt(0);
            int firstBlankRow = getFirstBlankRow(sheet);
            Object rowData = data.getData();
            if (rowData == null)
                    return;
            if (rowData instanceof List){
                    outputReportDataInList(sheet,(List)rowData,firstBlankRow);
            }else if(rowData instanceof Object[]){
              outputReportDataInArray(sheet, (Object[]) rowData, firstBlankRow);
            }
            else if (rowData instanceof ReportData) {
              outputReportDataInReportData(sheet,(ReportData) rowData,firstBlankRow);
            }
            else {
              return;
            }

 

        wb.write( out );
}
       private void outputReportDataInList(HSSFSheet sheet,List data,int rownum){
              for (int j=rownum;j<rownum+data.size();j++){
                     HSSFRow row = sheet.createRow(j);
                     Object cellData = data.get(j-rownum);
                     if (cellData == null)
                            continue;
                     else if (cellData instanceof List)
                            outputReportCellDataInList(row,(List)cellData);
                     else if (cellData instanceof Object[])
                            outputReportCellDataInArray(row,(Object[])cellData);
                     else
                            continue;
              }
       }
private void outputReportCell(HSSFRow row,short col,Object data){
              if (data == null)
                     data = new String("");
              HSSFCell cell = row.createCell(col);
              cell.setEncoding(HSSFCell.ENCODING_UTF_16);
              cell.setCellValue(data.toString());
       }
19.分层处理
1.       分层方法:
BaseDAO - > SqlDAO - >Busi..DAO -> Busi..Proxy - > Action 调用
20.常用通用类

 

21.1024* 768   与 800*600 显示的解决方案
建立两个通用的CSS内容
如:放于每个jsp文件必须要包括的 css中
.jspwidthstyle{
   width:680
}
.jspwidthnullstyle{
   width:680
}
.jspwidth1024style{
    width:799
}
jsp中可以通过 标签库的内容进行控制 如 <common:cssType/>
只有在登陆的时间获得: 屏幕的width /height 存到 session中通过标签库来取内容
屏幕的width /height 获得方法:
   window.text1.value=window.screen.width;

 

或者不同的分辨率采用不同css文件

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=388860
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值