JavaEE技术手册
作者:zollty
一、几个术语
ASF:Apache Software Foundation,即Apache自由软件基金会。
Jakarta:ASF这个组织包含了很多软件项目,Jakarta是ASF旗下的一套Java解决方案的开源项目的名称,它包括了很多子项目,比如Tomcat、Ant、Struts等。
JVM:即Java虚拟机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。它屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JSP:即Java Server Page,是同HTML结合在一起的动态网页。
Servlet:是Java Servlet的简称,由Serve+Applet演变而来,字面意思即“服务端小程序”,和JSP属于同一个层面。它是服务器端的Java应用程序,由Web服务器进行加载。Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。
CGI:即Common Gateway Interface(通用网关接口),它是一段程序,运行在服务器上,提供同客户端HTML页面的接口,通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器,再把服务器执行的结果返还给HTML页;用CGI可以实现处理表格,数据库查询,发送电子邮件等许多操作,最常见的CGI程序就是计数器。CGI使网页变得不是静态的,而是交互式的。
PS:Java Servlet和CGI的比较
服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(CGI(Common Gateway Interface))应用程序完成的。然而,在服务器上运行Java,这种程序可使用Java编程语言实现。在通信量大的服务器上,Java Servlet的优点在于它们的执行速度更快于CGI程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。
PS:Java Servlet和JSP的比较
Servlet和JSP在底层运行的原理上是完全一样的。运行时,JSP必须被Web服务器编译成Servlet,真正提供HTTP服务的也是Servlet,因此广义的Servlet包含JSP和Servlet。目前的JavaEE应用中已经很少单纯的使用Servlet充当表示层,更多的是作为控制层组件来使用。
Tomcat:是一个免费开源的Servlet容器,是Jakarta项目中的一个核心项目,最初是由Sun的软件构架师James Duncan Davidson开发的,后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。
MVC:即MVC框架(Model-View-Controller Framework),它包括3类对象:Model是应用对象,也就是功能逻辑,View是指在屏幕上的表示,也就是UI(User Interface用户界面);Controller定义用户界面对于用于输入的响应方式,即对请求和应答事件进行处理。通常把MVC按软件层次分成3层:视图(View)层,模型(Model)层,控制(Controller)层。
Struts:Struts也是Jakarta的一个核心子项目,它提供了一种方法,可以在一个Web应用程序中一起使用JSP和Servlet。其目的是要解决完全由JSP或Servlet实现的传统应用程序中固有的问题,例如,用JSP很难将Java代码同HTML分开,结果将导致代码易懂性不高,后期维护较难。Struts其实也是一个MVC框架,但Struts的重点在于C端(控制端),同时也为V端提供了一系列定制的标签,但是几乎没有涉及到M端。所以在流行的轻量级MVC框架组合SSH中,Struts只是扮演了Controller端的角色。
JavaBean:是一种JAVA语言写成的可重用组件,是公共的Java类。在IDE中,JavaBean的功能允许应用开发者浏览其中的方法,即JavaBean是被编译的,无法利用原始的源文件。此外,还发展出了企业Bean(Enterprise JavaBeans),即EJB,它包括会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。由于EJB2.0过于复杂,在Spring和Hibernate等轻量级框架出现后,大量的用户放弃了EJB。但目前轻量级的EJB3.0、EJB3.1已经放出,并得到了认可。
PS:JavaBean和EJB的区别
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应用分层模型
大致分为如下五层:
(数据持久层——>数据访问层)——>业务逻辑层——>控制层——>表示层
数据持久层:该层由一系列负责操纵POJO(Plain Old Java Object,普通的、传统的Java对象)的类组成,这些类负责把数据进行持久化,一般是把数据保存到数据库中。
数据访问层:该层由一系列的DAO(Data Access Object)组件组成,实现对数据的增、删、改、查等细粒度的操作。
业务逻辑层:该层由一系列的业务逻辑对象组成,实现系统所需要的业务逻辑方法。
控制层:此层由一系列控制器组成,用于拦截用户请求并调用业务逻辑对象的业务方法来处理请求,根据处理结果转发到不同的表示层。
表示层:此层由一系列的视图组件(例如JSP页面)组成,负责收集用户请求并显示处理结果。
JavaEE各层组件之间以松散的方式耦合在一起。
POJO对象1<——DAO对象1
POJO对象2<——DAO对象2 <——业务逻辑对象<——控制层<——表示层组件
POJO对象3<——DAO对象3
Hibernate:它是一个开源的、轻量级的ORM(Object Relation Mapping)持久化框架,它允许应用程序以面向对象的方式来操作关系型的数据库。通过简单的配置和编码即可替代JDBC繁琐的程序代码。在Java语言中,数据可以存储在实体对象中,同时实体对象之间具有继承、多态和聚合等特点,而在数据库中存储的是二维关系数据,表与表的关系只有主外键关联关系,Hibernate的引入可以解决上述矛盾。
Spring:Spring框架是JavaEE应用的全方位解决方案,它贯穿于表示层、业务层和持久层。Spring自身还提供了一个MVC框架:Spring MVC,使用Spring可以直接使用该MVC框架,也可以方便地与其他MVC框架集成,它像是一个中间容器,向上可以与MVC框架整合,向下可以和各种持久层框架整合(Hibernate、iBATIS、OJB、JDBC),将系统中的各个部分组件以松散的方式结合在一起。
Spring作为一个一站式的JavaEE解决方案,渗透了JavaEE技术的方方面面,它主要用来实现依赖注入、面向切面编程(AOP,用于降低耦合)、声明式事务以及对持久层的支持和简化等功能。最新的Spring框架也集成了JPA(Java Persistence API,Java持久化API),并实现了EJB3.0的一些特性。
根本区别是,PUT是“幂等的”(indempotent),而POST则不是。
例如,新增一条记录,每次请求,如果参数一样,都会执行同样的动作(即,新增一条记录),那么就可以用PUT方法。反之,如果第二次请求,参数和第一次一样,但是服务端因为数据已经存在,不予新增记录。那么这类请求就是“非幂等的”,应该使用POST方法。
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包(集成了jdk和tomcat等)。安装文件名是:
myeclipse-10.0-offline-installer-windows.exe
安装完MyEclipse的ALL in ONE包之后,我又安装了最新版的Tomcat和JDK。方法如下:
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.整合MyEclipse和JDK
新建工程的时候,在选择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版本,那个Marven和JSTL默认不选。
文件路径默认是在MyEclipse的工作空间下的,WebRoot下存放JSP文件。
7.新建JSP文件
在Web Project工程中的WebRoot目录上右键单击,如果New里面有就直接新建JSP(Advanced Templates),如果没有则比较麻烦:New->others,展开Web,找到JSP(Advanced Templates)。
8.Myeclipse部署Web项目
点击图标:左边那个,然后Add相应的Tomcat就可以了。
这样操作后,MyEclipse会在Tomcat的Web目录(默认为webapps)下生成一个以工程名命名的文件夹,WebRoot下的JSP文件会同步到该目录中,以便Tomcat加载。
注意:MyEclipse自带的Tomcat的webapps路径在:
\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";也可以直接把user和passwd写在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
6)ResultSet结果集,将查询到的结果赋值给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; }//注意顺序rs、stmt、conn
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之Filter和Listener
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("yyyy年MM月dd日 HH:mm:ss.S");//S为毫秒
sdf.format(dt.parse(sDate));//通过df.parse(sDate)将得到一个Date实例
二、设计模式基础(略)
1、DAO
2、MVC简介之Model 1和Model 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
之类的语句就可以了。
JPA注解