一、框架介绍
1.Apache Click 是一个先进的Java企业版的Web应用程序框架,提供一个基于浏览器的富客户端编程模型。
主要的特点包括:
- 易学
- 面向组件和页面的设计
- 基于事件的编程模型
- 性能非常好
- 自动的表单生成以及客户端、服务器端数据验证
- 支持 Velocity、JSP、FreeMarker 等模板引擎
- 采用 Apache 开源协议
- 支持 JDK 1.4 以及以后的版本
2.eclipselink jpa是一个类似于hibernate的持久化框架,通过注解的方式实现简单映射。
3.spring就不多介绍,数据库使用mysql,项目管理用maven
二、编写框架对应的配置文件
1.通过maven生成一个工程,如工程名为click,然后为工程新建两个maven module,一个为web工程click-web,另一个为普通java工程click-core。
2.为每个工程的pom文件中加入对应的依赖包:
click的pom:
<artifactId>click</artifactId>
<groupId>com.xxx</groupId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>click-core</module>
<module>click-web</module>
</modules>
<dependencies>
<!--加入一些公用包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
3.click-web的pom:(加入click框架所需包)
<parent>
<artifactId>click</artifactId>
<groupId>com.xxx</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.xxx</groupId>
<artifactId>click-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>click-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<javax.servlet.version>2.5</javax.servlet.version>
<click.version>2.3.0</click.version>
</properties>
<dependencies>
<dependency>
<groupId>com.yaolinnan</groupId>
<artifactId>click-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
<version>${javax.servlet.version}</version>
</dependency>
<dependency>
<groupId>org.apache.click</groupId>
<artifactId>click-nodeps</artifactId>
<version>${click.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.click</groupId>
<artifactId>click-extras</artifactId>
<version>${click.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>click-web</finalName>
</build>
4.click-core的pom:(加入spring和eclipselink包)
<parent>
<artifactId>click</artifactId>
<groupId>com.xxx</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.xxx</groupId>
<artifactId>click-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>click-core</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jpa.version>2.0.0</jpa.version>
<spring.version>3.0.6.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>${jpa.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId> org.aspectj</groupId >
<artifactId> aspectjweaver</artifactId >
<version> 1.6.11</version >
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
5.在click-web工程下的src/main/resources目录下生成click.xml,编写click框架的配置信息:
<click-app charset="UTF-8">
<pages package="com.xxx.pages" automapping="true"/>
<mode value="debug"/>
</click-app>
web.xml:
<web-app>
<display-name>click-web</display-name>
<servlet>
<servlet-name>ClickServlet</servlet-name>
<servlet-class>org.apache.click.extras.spring.SpringClickServlet</servlet-class>
<init-param>
<param-name>inject-page-beans</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ClickServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>hello.htm</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:spring/*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
6.在click-core的src/main/resources目录下编写eclipselink框架的配置信息--persistence.xml
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="springjpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!-- 需要持久化的实体 -->
<class>com.xxx.core.model.User</class>
<properties>
<property name="eclipselink.ddl-generation.output-mode" value="both" />
</properties>
</persistence-unit>
</persistence>
在这个目录下新建spring/springcontext.xml,编写spring框架的配置信息
<context:annotation-config/>
<context:component-scan base-package="com.xxx.core"/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<!-- Spring transaction manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory" />
<!-- JPA shared entity manager -->
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean" p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="loadTimeWeaver">
<bean
class="com.xxx.core.util.NewInstrumentationLoadTimeWeaver"/>
</property>
<property name="dataSource" ref="mydataSource" />
<property name="JpaVendorAdapter" ref="jpaAdapter"/>
<property name="persistenceUnitName" value="springjpaPU"></property>
<property name="persistenceXmlLocation" value="classpath*:persistence.xml"/>
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" />
<property name="showSql" value="true" />
</bean>
<!--数据源配置-->
<bean id="mydataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxIdle" value="10"/>
<property name="maxActive" value="100"/>
<property name="maxWait" value="10000"/>
<property name="testOnBorrow" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="1200000"/>
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<property name="numTestsPerEvictionRun" value="5"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
<context:property-placeholder location="classpath*:spring/config.properties"/>
<!--DAO和Service注入-->
<bean id="userDAO" class="com.yaolinnan.core.dao.UserDAOImpl">
<property name="entityManager" ref="entityManager"></property>
</bean>
<bean id="userService" class="com.yaolinnan.core.service.UserServiceImpl"></bean>
新建config.properties,编写数据库配置信息
# MySql
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://xxx
jdbc.username=xxx
jdbc.password=xxx
jdbc.initialSize=1
jdbc.maxIdle=2
jdbc.minIdle=-1
jdbc.maxWait=10000
jdbc.maxActive=10
jdbc.testOnBorrow=true
jdbc.testOnReturn=true
jdbc.testWhileIdle=true
jdbc.logAbandoned=true
jdbc.removeAbandoned=true
jdbc.removeAbandonedTimeout=50
jdbc.validationQuery=select count(*) from dual
jdbc.timeBetweenEvictionRunsMillis=300000
jdbc.minEvictableIdleTimeMillis=300000
三、程序编写
1.click-core编写实体类,对应数据库中的表
@Entity
@Table(name="xxx")
public class User{
@Id
private int id;
private String userName;
private String loginName;
private String password;
private String email;
@Temporal(TemporalType.DATE)
private Date createDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
.........加入属性对应的set和get方法
}
2.编写DAO和Service(简单写下)
public class UserDAOImpl implements UserDAO{
private EntityManager entityManager;
@Override
public List<User> getUsers() {
Query q=entityManager.createQuery("SELECT t FROM User t ORDER BY t.id ASC");
return q.getResultList();
}
@Override
public User getUserbyId(int id) {
return entityManager.find(User.class, id);
}
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public void saveUser(User user) {
entityManager.persist(user);
}
}
3.编写一个继承自InstrumentationLoadTimeWeaver的类,这个类避免了工程启动时去jvm配置-javaagent:spring-agent.jar这个步骤,对应springcontext.xml中<property name="loadTimeWeaver">属性。
public class NewInstrumentationLoadTimeWeaver extends InstrumentationLoadTimeWeaver{
@Override
public void addTransformer(ClassFileTransformer transformer) {
try {
super.addTransformer(transformer);
} catch (Exception e) {}
}
}
4.在click-web编写page和页面来测试。
public class Hello extends Page{
private static final long serialVersionUID = 1L;
private UserService userService;
private Table table=new Table("userTable");
private ActionLink delete=new ActionLink("delete",this,"onDelete");
@Override
public void onInit() {
this.addControl(table);
this.addControl(delete);
table.setClass(Table.CLASS_SIMPLE);//设置表格显示的样式
table.setPageSize(10);//设置一页显示的数量
table.setShowBanner(true);
table.setSortable(true);//设置表格排序
table.addColumn(new Column("userName","名称"));//第一列显示的标题和对应model的值
Column column = new Column("email","邮箱");
column.setAutolink(true);//设置自动关联url或者email地址
column.setTitleProperty("loginName");//设置指向当前列显示的值
table.addColumn(column);
delete.setImageSrc("images/u86.png");//设置ActionLink显示的图片
delete.setTitle("删除");//设置ActionLink显示的名称
delete.setAttribute("onclick", "return window.confirm('确定要删除当前用户吗?');");//设置ActionLink的css对应的值
column = new Column("操作");
column.setTextAlign("center");
AbstractLink[] links = new AbstractLink[] { delete};//为当前列加上ActionLink(可多个)
column.setDecorator(new LinkDecorator(table, links, "loginName"));//添加的ActionLink操作对应的值
column.setSortable(false);
table.addColumn(column);
List<User> rowList=userService.getUsers();
table.setRowList(rowList);//为表格添加数据
this.addModel("list", rowList);
}
public Boolean onDelete(){
String name=delete.getValue();//得到用户点击删除操作时所对应的值
this.addModel("name", name);
return true;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>click table</title>
</head>
<body>
$userTable
#if($name)
<p>delete user name:$name</p>
#end
#foreach($user in $list)
<div>$user.userName</div>
#end
</body>
</html>