delphi转为java感觉很难,在项目中去学习,仍然不能理解java的理念,尤其是在java web上,框架什么弄得头大。

也找了很多的免费框架,也在使用中,但想做成一个自己想要的,却无法贯通,总感觉要涉及的东西很多,要学习的很多,学习成本很高。

流程比较

JAVA

下载工具(JDK\ECLIPSE\TOMCAT\XAMPP

环境配置

创建工程

添加相关的JAR包(与D比起,应该是第三方控件,这个学习起来也很吃力)

配置工程

写代码(一个业务可能要创建很多的文件,一层一层的)

WAR

部署环境

DELPHI

安装

安装第三方控件

创建工程

写代码

编译

做安装包

 

其实不能完全这么对比(一种是WEBB/S架构,一种是桌面单机程序--即使可以做成伪C/SC/S是另一种方式),但对比一下,能相对理解一下其中的路数。

创建

新建一个Dynamic Web project

wKiom1VucC_xS35bAAE5U4egTd4979.jpg

wKioL1VuccrxsMYJAAMnxIzxLIE988.jpg

wKiom1VucDDBTmF2AAFX3nMWc7c777.jpg

wKioL1VuccuxAMh0AAFCKhbFc-0039.jpg

 

Context root中的名字就是将来网站的名称,创建后的结构

wKiom1VucFqRFge_AADCoeCpgvM886.jpg

 

这个是没有可以显示的页面,需要在WebContent中建一个首页,打开web.xml,可以看到在<welcome-file-list>里有多个welcome-file,选择一个,其他删除。

一个基于XXX的框架

后端

核心框架:Spring Framework 4.0

安全框架:Apache Shiro 1.2

视图框架:Spring MVC 4.0

服务端验证:Hibernate Validator 5.1

布局框架:SiteMesh 2.4

工作流引擎:Activiti 5.15

任务调度:Spring Task 4.0

持久层框架:MyBatis 3.2

数据库连接池:Alibaba Druid 1.0

缓存框架:Ehcache 2.6Redis

日志管理:SLF4J 1.7Log4j

工具类:Apache CommonsJackson 2.2Xstream 1.4Dozer 5.3POI 3.9

前端

* JS框架:JQuery 1.9

* CSS框架:Twitter Bootstrap 2.3.1

客户端验证:JQuery Validation Plugin 1.11

富文本:CKEcitor

文件管理:CKFinder

动态页签:Jerichotab

手机端框架:Jingle

数据表格:jqGrid

对话框:jQuery jBox

下拉选择框:jQuery Select2

树结构控件:jQuery zTree

日期控件: My97DatePicker

显示一个数据页

看上去感觉很恐怖?这是开源框架jeesite所需要的内容。之前的那个算是什么呢?如果做成一个可以用的后台,加一个显示页,需要添加相关的JAR包,然后写相关的代码,一步一步地来。

建立数据库和表

mysql中建立一个数据库mydb,建立一个表t_user

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(50) DEFAULT NULL,
  `lastname` varchar(50) DEFAULT NULL,
  `phone` varchar(200) DEFAULT NULL,
  `email` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;


根据表的结构,在工程中建立相关代码

新建实体类

src目录下新建entity包,在其下建立一个类(class

wKioL1VucijCVtNXAAJQjDIcQXk462.jpg

 

t_user表中的字段写上,然后使用eclipse自带的代码生成工具生成相关代码,右键选择

wKiom1VucKWCrlOKAAHx2orO01I071.jpg

wKiom1VucKXRyFWEAAH3hcvd-Ck548.jpg

 

全部代码:

package entity;
 
public class TUser {
 
private int id;
private String firstname;
private String lastname;
private String phone;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}

}


新建接口类

新建一个dao包,并建一个接口(Interface

wKioL1VucmOjYBhpAAHrKB55Zd4204.jpg

 

建立一个接口方法getUserList()获取所有用户的信息

package dao;
 
import com.alibaba.fastjson.JSONObject;
 
public interface TUserDao {

public JSONObject getUserList();
 
}

这只是一个接口,实现的方法需要再建一个impl包。其实可以不用建立,但为了养成好的代码习惯,这个必须建立。

 

wKioL1VucouzpAopAAKWG7Z9c_g976.jpg

注意package的名称,会将文件建立在不同的目录下。建立好后,在代码中引用TUserDao

package dao.impl;
 
import com.alibaba.fastjson.JSONObject;
 
import dao.TUserDao;
 
public class TUserDaoImpl implements TUserDao{
 
public JSONObject getUserList(){

return null;
}
}


业务代码

现在开始写一个查询。

因为是返回JSON格式的数据,现在就需要一个第三方控件了(JAR包)fastjson-1.1.37.jar,将JAR包放在WebContent/WEB-INF/lib目录下。

因为要使用的数据库是mysql,那么,这个数据库连接的JAR包(mysql-connector-java-5.1.27.jar)也要放进去。

建一个公共库包common,先建一个数据库连接的类(DBConn.java)。

package common;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
 
public class DBConn {
/*
 * 关闭数据库连接
 */
public void closeConn(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
 
// 连接
public Connection opencon() {
try {
//设置JAR包
Class.forName("com.mysql.jdbc.Driver");
//参数:连接字符串、用户名、密码
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jsjddb?useUnicode=true&characterEncoding=UTF-8",
"root", "");
} catch (Exception e) {
System.out.println("连接失败");
e.printStackTrace();
}
return null;
}
}


写好数据库连接的类后,就可以在
TUserDaoImpl 中写查询了。

由于查询出的数据返回的是一条条的记录,属于JSONAarrayJSON数组),为方便写一个方法(resultSetToJsonArr)进行自动生成。这样,TUserDaoImpl 中的getUserList()就完成了。

package dao.impl;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
 
import common.DBConn;
import dao.TUserDao;
 
public class TUserDaoImpl implements TUserDao{
 
public JSONArray resultSetToJsonArr(ResultSet rs)
throws SQLException, JSONException {
// json数组
JSONArray array = new JSONArray();
 
// 获取列数
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
 
// 遍历ResultSet中的每条数据
while (rs.next()) {
 
JSONObject jsonObj = new JSONObject();
 
// 遍历每一列
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
String value = rs.getString(columnName);
jsonObj.put(columnName, value);
}
array.add(jsonObj);
}
 
return array;
}

public JSONObject getUserList(){

DBConn db = new DBConn();
Connection conn = db.opencon();
String sql = "select * from t_user";
JSONObject jsodata = new JSONObject();
try {
ResultSet rs;
JSONArray result;
PreparedStatement pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
result = resultSetToJsonArr(rs);
//不直接增加一个json数据,而配合之后的bsgrid来进行数据显示,增加其它必要的参数
jsodata.put("success", "true");
jsodata.put("curPage", 1);
jsodata.put("totalRows", 5);
jsodata.put("data", result);
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.closeConn(conn);
}
return jsodata;
}

 
}


注意
import都是哪些包,有时同一个函数多个包都有此方法。

完成业务代码后,就是对外的接口,建立一个servlet可以进行通信获取到相关的数据,进行页面显示

servlet

新建一个servlet包,建立一个servlet

 

wKiom1VucTGgILbLAAGS3YQgmWM374.jpg

wKioL1Vucsyj3hk-AAHHNUuXtlQ228.jpg

之后默认即可。

JAVA JDK1.6会自动在web.xml里声明servlet1.8会在servlet上加注释@WebServlet("/GetUser"),所有就不用在web.xml里修改了。

@WebServlet("/GetUser")
public class GetUser extends HttpServlet {

这里只使用doGet,所以doPost调用doGet方法

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

然后在doGet里写相关代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("application/json");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
TUserDao user = new TUserDaoImpl();
JSONObject json = user.getUserList();
out.print(json);
out.flush();
out.close();
}

完成后,运行XAMPP中的MYSQL,执行TOMCAT,可以通过写链接地址(http://localhost:8080/myDwp/GetUser)看到JSON数据

{"curPage":1,"data":[{"email":"name1@gmail.com","firstname":"fname1","id":"3","lastname":"lname1","phone":"(000)000-0000"},{"email":"name2@gmail.com","firstname":"fname2","id":"4","lastname":"lname2","phone":"(000)000-0000"},{"email":"name3@gmail.com","firstname":"fname3","id":"5","lastname":"lname3","phone":"(000)000-0000"},{"email":"name4@gmail.com","firstname":"fname4","id":"7","lastname":"lname4","phone":"(000)000-0000"},{"email":"name5@gmail.com","firstname":"fname5","id":"8","lastname":"lname5","phone":"(000)000-0000"},{"email":"name6@gmail.com","firstname":"fname6","id":"9","lastname":"lname6","phone":"(000)000-0000"},{"email":"name7@gmail.com","firstname":"fname7","id":"10","lastname":"lname7","phone":"(000)000-0000"},{"email":"name8@gmail.com","firstname":"fname8","id":"11","lastname":"lname8","phone":"(000)000-0000"},{"email":"name9@gmail.com","firstname":"fname9","id":"12","lastname":"lname9","phone":"(000)000-0000"},{"email":"name10@gmail.com","firstname":"fname10","id":"13","lastname":"lname10","phone":"(000)000-0000"}],"success":"true","totalRows":5}


去除转义符并格式化后

{
    "curPage": 1,
    "data": [{
        "email": "name1@gmail.com",
        "firstname": "fname1",
        "id": "3",
        "lastname": "lname1",
        "phone": "(000)000-0000"
},
...此处省略部分数据
, {
        "email": "name4@gmail.com",
        "firstname": "fname4",
        "id": "7",
        "lastname": "lname4",
        "phone": "(000)000-0000"
    }],
    "success": "true",
    "totalRows": 5
}

其中的data的值是JSON数组格式

页面

WebContent建立一个index.jsp,这时需要引用一个第三方显示控件(bsgrid)将jquery.bsgrid复制到WebContent目录下,这个bsgrid目录下包含了jqueryjs文件,如果有其他的js也要调用并且可能版本不同就要注意了,会冲突的。

建立的jsp文件也可以是html,根据web.xml中的welcome-file来建立。

wKiom1VucZeyagp5AADkTiATuCM461.jpg

 

小节

目前使用了Jsonmysql的两个包进行数据连接与数据格式化,使用了bsgrid来进行显示。所有文件如图:

wKiom1VucaTzd5mMAAFIQDP0iAA425.jpg

 

一个简单的B/S的程序做出来了。但是感觉如果做一个项目,会很麻烦,也有一些安全问题会产生。所以,之前那个基于XXXJAR包的框架里就会有多个要学习的,但在开发上会节省很多时间的第三控件了。