JavaEE技术手册
2012年04月16日

JavaEE技术手册

作者:zollty

 一、几个术语

ASFApache Software Foundation,即Apache自由软件基金会。

JakartaASF这个组织包含了很多软件项目,JakartaASF旗下的一套Java解决方案的开源项目的名称,它包括了很多子项目,比如TomcatAntStruts等。

JVMJava虚拟机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。它屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

JSPJava Server Page,是同HTML结合在一起的动态网页。

ServletJava Servlet的简称,由Serve+Applet演变而来,字面意思即“服务端小程序”,和JSP属于同一个层面。它是服务器端的Java应用程序,由Web服务器进行加载。Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。

CGICommon Gateway Interface(通用网关接口),它是一段程序,运行在服务器上,提供同客户端HTML页面的接口,通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器,再把服务器执行的结果返还给HTML页;用CGI可以实现处理表格,数据库查询,发送电子邮件等许多操作,最常见的CGI程序就是计数器。CGI使网页变得不是静态的,而是交互式的。

PSJava ServletCGI的比较

    服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(CGI(Common Gateway Interface))应用程序完成的。然而,在服务器上运行Java,这种程序可使用Java编程语言实现。在通信量大的服务器上,Java Servlet的优点在于它们的执行速度更快于CGI程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。

PSJava ServletJSP的比较

    ServletJSP在底层运行的原理上是完全一样的。运行时,JSP必须被Web服务器编译成Servlet,真正提供HTTP服务的也是Servlet,因此广义的Servlet包含JSPServlet。目前的JavaEE应用中已经很少单纯的使用Servlet充当表示层,更多的是作为控制层组件来使用。

Tomcat是一个免费开源的Servlet容器,是Jakarta项目中的一个核心项目,最初是由Sun的软件构架师James Duncan Davidson开发的,后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。

MVCMVC框架(Model-View-Controller Framework),它包括3类对象:Model是应用对象,也就是功能逻辑,View是指在屏幕上的表示,也就是UIUser Interface用户界面);Controller定义用户界面对于用于输入的响应方式,即对请求和应答事件进行处理。通常把MVC按软件层次分成3层:视图(View)层,模型(Model)层,控制(Controller)层。

StrutsStruts也是Jakarta的一个核心子项目,它提供了一种方法,可以在一个Web应用程序中一起使用JSPServlet。其目的是要解决完全由JSPServlet实现的传统应用程序中固有的问题,例如,用JSP很难将Java代码同HTML分开,结果将导致代码易懂性不高,后期维护较难。Struts其实也是一个MVC框架,但Struts的重点在于C端(控制端),同时也为V端提供了一系列定制的标签,但是几乎没有涉及到M端。所以在流行的轻量级MVC框架组合SSH中,Struts只是扮演了Controller端的角色。

JavaBean是一种JAVA语言写成的可重用组件,是公共的Java类。在IDE中,JavaBean的功能允许应用开发者浏览其中的方法,即JavaBean是被编译的,无法利用原始的源文件。此外,还发展出了企业BeanEnterprise JavaBeans),即EJB,它包括会话BeanSession Bean),实体BeanEntity Bean)和消息驱动BeanMessageDriven Bean)。由于EJB2.0过于复杂,在SpringHibernate等轻量级框架出现后,大量的用户放弃了EJB。但目前轻量级的EJB3.0EJB3.1已经放出,并得到了认可。

PSJavaBeanEJB的区别

    JavaBean是使用java.beans包开发的,它是Java 2标准版的一部分。JavaBean是一台机器上同一个地址空间中运行的组件,是进程内组件。Enterprise Bean是使用javax.ejb包开发的,它是标准JDK的扩展,是J2EE的一部分。EJB是在多台机器上跨几个地址空间运行的组件,是进程间组件。

 

JavaEE中的两个MVC模型

MVC Model 1

即传统的JSP+JavaBean,目前已经很少用了,但是初学者学习Struts前有必要了解。

MVC Model 2

该模型的标准是:JSP(视图View,用户界面)+Servlet(控制器Controller,输入处理)+JavaBean(模型Model,功能逻辑)。由于Java EE中的JavaBean EJB2.0)太复杂了,所以该模型最流行的一个版本是SSH,即Struts+Spring+Hibernate

 

JavaEE应用分层模型

大致分为如下五层:

(数据持久层——>数据访问层)——>业务逻辑层——>控制层——>表示层

 

数据持久层:该层由一系列负责操纵POJOPlain Old Java Object,普通的、传统的Java对象)的类组成,这些类负责把数据进行持久化,一般是把数据保存到数据库中

数据访问层:该层由一系列的DAOData Access Object)组件组成,实现对数据的增、删、改、查等细粒度的操作

业务逻辑层:该层由一系列的业务逻辑对象组成,实现系统所需要的业务逻辑方法

控制层:此层由一系列控制器组成,用于拦截用户请求并调用业务逻辑对象的业务方法来处理请求,根据处理结果转发到不同的表示层。

表示层:此层由一系列的视图组件(例如JSP页面)组成,负责收集用户请求并显示处理结果。

JavaEE各层组件之间以松散的方式耦合在一起。

POJO对象1<——DAO对象1

POJO对象2<——DAO对象2 <——业务逻辑对象<——控制层<——表示层组件

POJO对象3<——DAO对象3

 

Hibernate它是一个开源的、轻量级的ORMObject Relation Mapping)持久化框架,它允许应用程序以面向对象的方式来操作关系型的数据库。通过简单的配置和编码即可替代JDBC繁琐的程序代码。在Java语言中,数据可以存储在实体对象中,同时实体对象之间具有继承、多态和聚合等特点,而在数据库中存储的是二维关系数据,表与表的关系只有主外键关联关系,Hibernate的引入可以解决上述矛盾。

 

SpringSpring框架是JavaEE应用的全方位解决方案,它贯穿于表示层、业务层和持久层。Spring自身还提供了一个MVC框架:Spring MVC,使用Spring可以直接使用该MVC框架,也可以方便地与其他MVC框架集成,它像是一个中间容器,向上可以与MVC框架整合,向下可以和各种持久层框架整合(HibernateiBATISOJBJDBC),将系统中的各个部分组件以松散的方式结合在一起。

    Spring作为一个一站式的JavaEE解决方案,渗透了JavaEE技术的方方面面,它主要用来实现依赖注入、面向切面编程(AOP,用于降低耦合)、声明式事务以及对持久层的支持和简化等功能。最新的Spring框架也集成了JPAJava Persistence APIJava持久化API),并实现了EJB3.0的一些特性。

 


RESTful 之 HTTP中的PUT 和 POST的区别


根本区别是,PUT是“幂等的”(indempotent),而POST则不是。

何为“幂等”,官方的描述如下:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
也就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。

例如,新增一条记录,每次请求,如果参数一样,都会执行同样的动作(即,新增一条记录),那么就可以用PUT方法。反之,如果第二次请求,参数和第一次一样,但是服务端因为数据已经存在,不予新增记录。那么这类请求就是“非幂等的”,应该使用POST方法。


API和SPI

API : Application Programming Interface(应用编程接口), 语言、框架以及类库对外提供的编码的接口。 
SPI: 全名为Service Provider Interface
Service Provider Interface(服务提供商接口),满足某种服务标准的供应商提供的符合该标准的应用程序接口,SPI应该和该服务的 API标准是兼容的,应用程序一般应该是基于API编写,除非是SPI中包含API中没 有提供的功能而又必须使用。



OPGA是一种编程习惯

OPGA,即One Paramter Go Anywhere,是我总结出来的一种编程技巧和模式,并提供了编程的API。

养成这种习惯之后,能够很大程度上减轻我们的编程难度,比如,苦费心思的定义接口方法、定义各种参数Bean、返回值Bean等。这些你都无须提前考虑。 举个例子:我要定义一个供第三方系统查询任务的接口。当我在考虑第三方系统应该传入哪些参数时,感觉有些迷茫,因为我还没想好,我暂时也确定不了……最终,我是这样定义该接口的: queryTaskInfo(String tpsid, String taskNo)。后来, 在编写测试类时,想起来要给个查询时间的参数。那就得改接口方法。 习惯了OPGA设计模式后,编写程序就简单多了,不考虑那么多,直接定义一个 void queryTaskInfo(BeansSet beans),我即既不需要提前考虑需要传入什么参数,也不需要急着考虑返回些什么。


property、attribute、parameter / param的区别?


直观翻译:

property 属性、值、变量

parameter / param 参数

attribute 特性、私有属性


property和attribute都译为“参数”,有什么区别?


我举个例子来解释:


类的成员变量叫 attribute ,attribute通常是某个东西的特性。例如人的耳朵、鼻子、眼睛就是人的attributes;


property 通常是可变的数据, 比如,某些数据虽然是某个类的attributes,但是给它们加上setter/getter方法后


这些attributes就可以用在其他地方,在其他地方就叫做property,因为在其他地方它就不是特有的属性,而是可有可无、可多可少

的东西。


这么说吧,有如下一个类:

class Peason {
  String name;
  String age;
  public void talk(String words){
    Date date;
    date = new Date();
    System.out.print(date+words);
  }
}

这个name和age是attribute

words是parameter(param)

date是property,因为date是变量,是可有可无、可多可少的


总的来说,property的应用要广泛一些,你只需要认清楚attribute,那么剩下拿不准的就是property了,例如struts有一个标签就叫<s:property>

 


二、搭建环境

 

1.安装MyEclipse

直接下载安装,我是在电驴上下载的最新破解版10.0版,ALL in ONE包(集成了jdktomcat等)。安装文件名是:

myeclipse-10.0-offline-installer-windows.exe

 安装完MyEclipseALL in ONE包之后,我又安装了最新版的TomcatJDK。方法如下:

 

2.安装Tomcat

Tomcat直接解压,文件名是:

apache-tomcat-7.0.23-windows-x86.zip

然后给Tomcat设置(系统)环境变量:

变量名:TOMCAT_HOME,值:C:\……\apache-tomcat-7.0.23

变量名:CATALINA_HOME,值:%TOMCAT_HOME%

变量名:CLASSPATH,值:

.;
%JAVA_HOME%\lib\dt.jar;
%JAVA_HOME%\lib\tools.jar

 

3.安装JDK

直接双击EXE文件安装,文件名为:

jdk-7u1-windows-i586.exe

然后设置系统环境变量:

 

变量名:JAVA_HOME,值:C:\……\jdk1.7.0_01

变量名:Path,值(最前面加上):%JAVA_HOME%\bin;

 

4.整合MyEclipseJDK

新建工程的时候,在选择JRE的下面有一个Configure的链接,点击进去设置就OK

也可以在最上面的菜单栏选择Windows->Preferences展开java,找到InstalJREs,然后设置。(注意在选择“JRE Home”时要选择JDK的目录,例如D:\Java\jdk1.7.0_01,而不是选择JDK目录下面的JRE子目录!)

 

5. MyEclipse整合Tomcat

最上面的菜单栏选择Windows->Preferences展开MyEclipse->Servers->Tomcat,然后设置目录,并将Enable勾上,然后点击Apply,最后点击OK

配置和打开Tomcat服务的方法如下,直接在工具栏上找到:

 

6.新建Web Project工程和

直接new->Web Project或者new->Project然后再选择Web Project,选择相应的J2EE版本,那个MarvenJSTL默认不选。

 

文件路径默认是在MyEclipse的工作空间下的,WebRoot下存放JSP文件。

 

7.新建JSP文件

Web Project工程中的WebRoot目录上右键单击,如果New里面有就直接新建JSPAdvanced Templates),如果没有则比较麻烦:New->others,展开Web,找到JSPAdvanced Templates)。

 

8.Myeclipse部署Web项目

点击图标:说明: QQ拼音截图未命名左边那个,然后Add相应的Tomcat就可以了。

这样操作后,MyEclipse会在TomcatWeb目录(默认为webapps)下生成一个以工程名命名的文件夹,WebRoot下的JSP文件会同步到该目录中,以便Tomcat加载。

注意:MyEclipse自带的Tomcatwebapps路径在:

\Workspaces\MyEclipse\.metadata\.me_tcat\webapps

Tomcat安装目录在:

\MyEclipse\Common\plugins\com.genuitec.eclipse.easie.tomcat.myeclipse_9.0.0.me201109141806\tomcat

MyEclipse自带的JDK安装路径在:

\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013




6、数据库操作

1)将mysql-connector-java-5.0.8-bin.jar文件拷贝到WEB-INF/lib目录下;

2)使用Class.forName("com.mysql.jdbc.Driver");来加载MySQL驱动;

3)使用Connection conn=DriverManager.getConnection(url,user,passwd);连接数据库,其中一般定义String url="jdbc:mysql://localhost:3306/dbname";也可以直接把userpasswd写在dbname后:dbname?user=root&password=admin

4)创建语句对象Statement,以便执行SQL,例如:

Statement stmt = conn.createStatement();

String addUser="INSERT INTO user(userid,username,passwd) VALUES(null,

'Zollty','1234')";

stmt.executeUpdate(adduser);

以下是连接mysql数据库的示范java文件:

package csai.db;

import java.sql.*;

 

public class DBConn {

    //得到数据库连

    public static Connection createDBConn(){

        try{

        Class.forName("com.mysql.jdbc.Driver");

        Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/root","root","admin");

            return conn;

        }catch(Exception e){

            e.printStackTrace();

            return null;

        }

    }

    //数据库连

    public static void closeConn(Connection conn){

        try{

            conn.close();

        }catch(Exception e){

            e.printStackTrace();

        }

    }  

}

 

5) 更新executeUpdate,查询executeQuery


6ResultSet结果集,将查询到的结果赋值给ResultSet,用getXXX(n)取出具体的字段,例如

ResultSet rs = stmt.executeQuery("SELECT * FROM user");

while(rs.next()){

       int userid= rs.getInt(1); //取出第一个字段

       String username= rs.getString(2); //第二个字段

}

SQL技巧:SELECT userid,username FROM user limit 1,3


7)关闭数据库

通常如下:

try{

       if(rs != null){ rs.close(); rs=null; }//注意顺序rsstmtconn

       if(stmt != null){ stmt.close(); stmt=null; }

       if(conn != null){ conn.close(); conn=null; }

}catch(Exception e){

       out.println("数据库关闭异常");

}


8)预处理语句对象PreparedStatement

Statement差不多,最大的区别在于可以在SQL语句中用?代替实际值,在后面才调用对象的setXXX(n,xx)方法为第n?XXX类型的值,例如

String addUser ="INSERT INTO user(userid,username,passwd) VALUES(null,?,?)";

PreparedStatement pstmt= conn.prepareStatement(addUser);

pstmt= conn.setString(1,"Zollty");

pstmt= conn.setString(2,"123456"); //设置参数

pstmt.exetuteUpdate(); //直接执行Update,此时无需参数。


10、网页中访问Servlet(须在web.xml中配置)
src文件夹下新建一个com.zollty包,然后新建ServletDemo0类,在WEB-INF文件夹下的web.xml中配置这个类:在<web-app>标签对之间添加

         <servlet>

                   <servlet-name>ServletDemo01</servlet-name>

                   <servlet-class>com.zollty.ServletDemo01</servlet-class>

         </servlet>

         <servlet-mapping>

                   <servlet-name>ServletDemo01</servlet-name>

                   <url-pattern>/ServletDemo01</url-pattern>

         </servlet-mapping>


11、Servlet之FilterListener

Filter开发分为二个步骤:

1.编写java类实现Filter接口,并实现其doFilter方法。

2.在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

Filter链实验(查看filterChain API文档)

Filter的部署-注册Filter

<filter>

    <filter-name>testFitler</filter-name>

    <filter-class>org.test.TestFiter</filter-class>

    <init-param>

        <param-name>word_file</param-name>

        <param-value>/WEB-INF/word.txt</param-value>

    </init-param>

</filter>

1.<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

2.<filter-class>元素用于指定过滤器的完整的限定类名。

3.<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

 

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

<servlet-name>指定过滤器所拦截的Servlet名称。

<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

<dispatcher> 子元素可以设置的值及其意义:

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

Tip:Filter的部署—映射Filter示例:

<filter-mapping>

     <filter-name>testFilter</filter-name>

     <url-pattern>/test.jsp</url-pattern>

</filter-mapping>

<filter-mapping>

     <filter-name>testFilter</filter-name>

     <url-pattern>/index.jsp</url-pattern>

     <dispatcher>REQUEST</dispatcher>

     <dispatcher>FORWARD</dispatcher>

</filter-mapping>

FilterConfig接口:

用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

String getFilterName():得到filter的名称。

String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.

Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

public ServletContext getServletContext():返回Servlet上下文对象的引用。

 

12、AJAX基础


知识补充:日期和时间

通常要:将自定义的日期和系统时间连接起来,形成一个Date字符串。如果还需要格式化时间,则利用parse函数将标准的Date字符串转换成Date对象,然后就可以交给format来格式化了。方法如下:

DateFormat t=DateFormat.getTimeInstance();

String time= t.format(new java.util.Date());//当前时间HH:mm:ss样式的,没有毫秒

String sDate="2020-11-11"+" "+time;//完整的日期

DateFormat dt=DateFormat.getDateTimeInstance();//按默认的完整的Date样式来格式化

SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss.S");//S为毫秒

sdf.format(dt.parse(sDate));//通过df.parse(sDate)将得到一个Date实例

 

二、设计模式基础()

1DAO

2MVC简介之Model 1Model 2


 

==========知识补充============

连接数据库的基本步骤:

       1. 加载数据库驱动(Driver Class),例如com.mysql.jdbc.Driver

       2. 连接数据库的url,例如

              jdbc:mysql://localhost:3306/javaweb

       把返回的对象赋值给一个Connection对象(通常命名为conn

 

连接后就可以使用数据库了,使用的基本步骤为

       1. 创建语句对象(Statement),例如

              Statement stmt = conn.createStatement();

       注意右边的conn就是连接url时返回的Connection对象

       2. 调用语句对象的方法来对数据库进行操作,例如

              stmt.exeuteUpdate("SQL语句");

 =============================


Tomcat配置

 

会话超时时间:

\conf\web.xml

    <session-config>

        <session-timeout>-1</session-timeout>

    </session-config>

 

URL中文支持:

\conf\server.xml

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

加入:URIEncoding="utf-8"

 

 

CKFinder破解

 

CKEditor图片预览文字

\ckeditor\plugins\image\dialogs\image.js

 

初始化:

<%@ taglib uri="http://ckeditor.com" prefix="ckeditor" %>

<%@ taglib uri="http://ckfinder.com" prefix="ckfinder" %>

 

<!-- 整合CKFinder和CKEditor -->

<ckfinder:setupCKEditor basePath="/zollty/CKFinderJava/userfiles/" editor="editor1" />

<ckeditor:replace replace="editor1" basePath="/zollty/CKFinderJava/userfiles/" />

 

方法二:

<script type="text/javascript" src="/zollty/ckeditor/ckeditor.js"></script>

<script type="text/javascript" src="/zollty/ckfinder/ckfinder.js"></script>

 

<!-- 整合CKFinder和CKEditor -->

<script type="text/javascript">

var editor = CKEDITOR.replace( 'editor1',

   {

      toolbar : 'Basic'

   });

   CKFinder.SetupCKEditor( editor, '/zollty/CKFinderJava/userfiles/' );

</script>

 

 DateUtil.DateToString(user.getBirthday(),"yyyy-MM-dd");

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

       public static Date StringToDate(String dateString,String formatString){
              try {
                     DateFormat fm = new SimpleDateFormat(formatString);
                     Date date = null;
                     try {
                            date = fm.parse(dateString);

                     } catch (java.text.ParseException e) {
                            return null;
                     } 
                     // Thu Jan 18 00:00:00 CST 2007
                     return date;

              } catch (Exception e) {
                     return null;
              }
       }

       public static String DateToString(Date date,String formatString){
              try {
                     DateFormat fm = new SimpleDateFormat(formatString);
                     String str = new String();
                     str = fm.format(date);  
                     return str;
              } catch (Exception e) {
                     return null;
              }
       }
}

 



 

JDBC用配置文件连接数据库

 

配置文件为:src/db.properties,其内容如下

driver_class=com.mysql.jdbc.Driver

url=jdbc\:mysql\://localhost\:3306/user

username=root

password=a123456

 

下面是连接数据库的程序:

    public static Connection getConnection(){

       Connection connection = null;

       try{

           Properties properties = getProperties();

           driver_class = properties.getProperty("driver_class");

           url = properties.getProperty("url");

           username = properties.getProperty("username");

           password = properties.getProperty("password");

          

           Class.forName(driver_class);

          

           connection = DriverManager.getConnection(url,username,password);

          

       }catch (Exception e) {

           e.printStackTrace();

       }

      

       return connection;

    }

 

    public static Properties getProperties(){

       Properties properties = new Properties();

       try {

            FileInputStream fileInputStream = new FileInputStream("src/db.properties");

           properties.load(fileInputStream);

          

           String driver_class = properties.getProperty("driver_class");

           System.out.println(driver_class);

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       } catch (IOException e) {

           e.printStackTrace();

       }  

       return properties;

    }

 

    public static void closeConn(Connection conn) {

       try {

           if(conn!=null)

              conn.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

   

常见技术问题、经验汇总


1、问:怎么在JSP页面的一个List或Set中查找一个元素?

解析:

方法1:

最原始的方法,循环遍历,用JSTL标签就可以做。

 

方法2:

在Struts2标签中,可以用in关键字或contains方法。比如:

<s:if test="#stu2 in studentSet">checked</s:if>

<s:if test="# stu2 in studentList">checked</s:if>

<s:if test="studentList.contains(#stu2)">checked</s:if>

<s:if test="studentSet.contains(#stu2)">checked</s:if>

注意,低版本的Struts2可能不支持这种方法。

 

方法3:

如果元素是String类型,用JS可以巧妙地实现。关键之处:用元素名作为id。比如

<input id="name1" type="checkbox"/>

<input id="name2" type="checkbox"/>

然后写JS代码:

var studentStr = "<s:property value=" students" />";
var studentArray = studentStr.split(",");
$.each(studentArray, function(index, value){
    var id = "#"+value;
    $(id).attr("checked","checked");
});


3、问:如何获得可配置的下拉菜单数据?数据存于数据库中,比如银行列表,如下:

<select name="bankList" id="band_list">
    <option value="ICBC">工商银行</option>
    <option value="ALIPAY">支付宝</option>
</select>

解析:

方法1:动态获取

每次都到数据库中去查询。这种方法,效率低,但实时性高,适合实时变动的数据。

方法2:静态获取

只在服务器启动时查询一次,然后放到缓存中,以后直接取用。

首先编写一个CacheDataLoaderListener(实现ServletContextListener类),在服务器启动时就去加载数据库中的数据到静态变量中。

<listener>

    <listener-class>com.zollty.app.config.CacheDataLoaderListener</listener-class>

</listener>

public class CacheDataLoaderListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {

        ConfigCache.getInstance().loadAll();

    }

}

然后在页面上,用类似如下的方法获取数据:

<select name="bank" >
    <option value="">所有银行</option>
    <s:iterator value="@com.zollty.ConfigService@getBankMap()" id="bank">
        <option value='<s:property value="# bank.key"/>'>
            <s:property value="#bank.name"/>
        </option>
    </s:iterator>
</select>

上面的代码中用到了Struts标签的访问静态函数的功能。

也可放到session中,如下:

Java中写如下代码:this.getSession().setAttribute("bankSelectOption", bankList );

然后在页面用类似下面的方法获取:

<select name="bank" >
    <option value="">所有银行</option>
    <s:property value="#session.bankSelectOption" escape="false"/>
</select>

这个bankSelectOption是个字符串。


HttpClient报错

报错:socket closed AbstractSessionInputBuffer.fillBuffer

解决方案:
是提前关闭了输入流造成的,
去掉类似
 io.close() 
httpclient.getConnectionManager().shutdown()

之类的语句就可以了。


JPA注解

@Temporal(TemporalType.DATE)的作用
加上这一句,时间就只精确到天。去掉这一句,时间就可以精确到秒。