从零开始写javaweb框架笔记7-动手开发web应用
2015-12-05 23:12
821 查看
开发阶段,我们先搭建框架,然后慢慢的细化,完善功能。
1 创建数据库
项目的数据库,我使用mysql,下载安装好mysql数据库,下载安装好mysql的数据库管理界面工具Navicat Premium,项目的所有编码我们使用utf-8。
打开mysql的界面管理工具Navicat Premium,
1)点击连接
2)输入我们的项目的连接名mysql
3)输入主机名或者ip地址
4)输入数据库的用户名
5)输入数据库的连接密码
6)点击连接测试,看能否连接成功
注意:如果不能连接成功,看是否是mysql的服务没有打开,输入cmd,打开命令窗口,输入net
start mysql回车 ,启动mysql服务,关闭输入net stop mysql 回车即可。
如果连接测试成功点击确定即可。
经过以上步骤连接就成功了,下面我们开始创建一个demo数据库
7)点击连接名mysql,选择新建数据库,输入数据库名demo,选择数据库的字符编码utf-8,然后确定即可创建一个名为demo的数据库
连接名mysql下出现了demo数据库。
2
准备开发环境
在IDEA中创建一个新的Maven项目,名为chapter2,它是一个web项目,创建的方法可以参考前面的博客。以下是生成的pom.xml文件:
在java目录下创建一个org.jack.com包,并在相应的路径下创建一个web.xml文件。为了使项目结构更加清晰,我们在org.jack.com包下添加controller,model,service子包。
当前的项目结构如下:
上面采用的是经典的mvc架构,使应用程序分成若干层,让每层做好自己的事情,责任更加清晰。
3
编写模型层
根据表结构的定义,我们创建如下图的模型类:
CREATE
TABLE customer(
`id` bigint NOT NULL AUTO_INCREMENT ,
`name` varchar(255) CHARACTER SET utf8 NULL DEFAULT NULL ,
`contact` varchar(255) NULL DEFAULT NULL ,
`telephone` varchar(255) NULL DEFAULT NULL ,
`email` varchar(255) NULL DEFAULT NULL ,
`remark` text NULL ,
PRIMARY KEY (`id`)
)
DEFAULT CHARACTER SET=utf8
;
在customer表中创建几条记录,执行如下的sql语句:
insert into customer values (1,'customer1','jack','13512341234','jack@gmail.com',null)
insert into customer values (2,'customer2','rose','13512351235','rose@gmail.com',null)
表里面的数据如下:
4
编写控制器层
由于我们的项目使用servlet作为控制器层的实现技术,下面的工作就是根据url的定义来编写具体的servlet,如下图。
servlete比较多,以CustomerCreateServlet为例进行描述:
继续了HttpServlet,所以需要引入Servlet的jar包的依赖,在pox.xml文件中添加如下代码。
在Servlet中,请求类型有GET,POST,PUT,DELETE,他们分别对应doGet,doPost,doPut,doDelete方法。
5 编写服务层
在标准的MVC架构中是没有服务层的,我们将该层作为衔接控制器与数据库之间的桥梁,可以使用接口和实现类来表达,在简单的情况下,无须使用接口,直接用类就可以了,并非所有情况都需要定义一个接口,要根据实际情况来做出选择。服务层如图:
其中CustomerService代码如下:
6
编写测试单元
使用Juit作为单元测试框架,需要在pom.xm中添加如下依赖:
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--<version>3.8.1</version>-->
<version>4.11</version>
<scope>test</scope>
</dependency>
然后在test/java中创建一个单元测试的类,org.jack.test.CustomerServiceTest,用于测试CustomerService类中的各个方法,如图:
代码如下:
package org.jack.test;
import org.jack.com.model.Customer;
import org.jack.com.service.CustomerService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by jack on 2015/12/5.
* 单元测试类CustomerServiceTest
*/
public class CustomerServiceTest {
private final CustomerService customerService;
public CustomerServiceTest(){
customerService = new CustomerService();
}
@Before
public void init(){
//to do 初始化数据库
}
@Test
public void getCustomerListTest() throws Exception{
List<Customer> customerList = customerService.getCustomerList("");
Assert.assertEquals(2,customerList.size());
}
@Test
public void getCustomerTest() throws Exception{
long id = 1;
Customer customer = customerService.getCustomer(id);
Assert.assertNotNull(customer);
}
@Test
public void createCustomerTest() throws Exception{
Map<String,Object> fieldMap = new HashMap<String, Object>();
fieldMap.put("name","customer100");
fieldMap.put("contact","John");
fieldMap.put("telephone","13512345678");
boolean result = customerService.createCustomer(fieldMap);
Assert.assertTrue(result);
}
@Test
public void updateCustomerTest() throws Exception{
long id = 1;
Map<String,Object> fieldMap = new HashMap<String, Object>();
fieldMap.put("contact","Eric");
boolean result = customerService.updateCustomer(1,fieldMap);
Assert.assertTrue(result);
}
@Test
public void deleteCustomerTest() throws Exception{
long id = 1;
boolean result = customerService.deleteCustomer(id);
Assert.assertTrue(result);
}
}
7.编写试图层
使用jsp充当视图层,在WEB-INF/view目录下存放所有的jsp文件,如图所示。
需要注意的是,推荐把jsp放到WEB-INF内部,而并非外部,因为用户无法通过浏览器地址栏直接请求放在内部的jsp,必须通过servlet程序进行转发(forward)和重定向(redirect)
以“创建客户”为例,在customer_create.jsp中编写如下代码:
<%--
Created by IntelliJ IDEA.
User: jack
Date: 2015/12/5
Time: 23:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>客户管理 - 创建客户</title>
</head>
<body>
<h1>创建客户界面</h1>
<%--TODO SOMETHING--%>
</body>
</html>
到这里,一个简单的web应用基本就开发完毕了,这只是一个简单的框架,在后面需要进行修饰。
1 创建数据库
项目的数据库,我使用mysql,下载安装好mysql数据库,下载安装好mysql的数据库管理界面工具Navicat Premium,项目的所有编码我们使用utf-8。
打开mysql的界面管理工具Navicat Premium,
1)点击连接
2)输入我们的项目的连接名mysql
3)输入主机名或者ip地址
4)输入数据库的用户名
5)输入数据库的连接密码
6)点击连接测试,看能否连接成功
注意:如果不能连接成功,看是否是mysql的服务没有打开,输入cmd,打开命令窗口,输入net
start mysql回车 ,启动mysql服务,关闭输入net stop mysql 回车即可。
如果连接测试成功点击确定即可。
经过以上步骤连接就成功了,下面我们开始创建一个demo数据库
7)点击连接名mysql,选择新建数据库,输入数据库名demo,选择数据库的字符编码utf-8,然后确定即可创建一个名为demo的数据库
连接名mysql下出现了demo数据库。
2
准备开发环境
在IDEA中创建一个新的Maven项目,名为chapter2,它是一个web项目,创建的方法可以参考前面的博客。以下是生成的pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.jack.com</groupId> <artifactId>chapter2</artifactId> <version>1.0.0</version> <packaging>war</packaging> </project>在后面我们会在该文件中添加一些dependcy,让项目依赖一些有用的jar包。
在java目录下创建一个org.jack.com包,并在相应的路径下创建一个web.xml文件。为了使项目结构更加清晰,我们在org.jack.com包下添加controller,model,service子包。
当前的项目结构如下:
上面采用的是经典的mvc架构,使应用程序分成若干层,让每层做好自己的事情,责任更加清晰。
3
编写模型层
根据表结构的定义,我们创建如下图的模型类:
package org.jack.com.model; /** * Created by jack on 2015/11/29. * 客户 */ public class Customer { /* * id * */ private long id; /* * 客户名称 * */ private String name; /* * 联系人 * */ private String contact; /* * 电话号码 * */ private String telephone; /* * 邮箱地址 * */ private String email; /* * 备注 * */ private String remark; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContact() { return contact; } public void setContact(String contact) { this.contact = contact; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } }编写玩模型类,生成get/set方法,下面我们在demo数据库里面创建一个名称为customer的表,使用mysql的界面管理工具创建customer表或者使用下面的sql语句:
CREATE
TABLE customer(
`id` bigint NOT NULL AUTO_INCREMENT ,
`name` varchar(255) CHARACTER SET utf8 NULL DEFAULT NULL ,
`contact` varchar(255) NULL DEFAULT NULL ,
`telephone` varchar(255) NULL DEFAULT NULL ,
`email` varchar(255) NULL DEFAULT NULL ,
`remark` text NULL ,
PRIMARY KEY (`id`)
)
DEFAULT CHARACTER SET=utf8
;
在customer表中创建几条记录,执行如下的sql语句:
insert into customer values (1,'customer1','jack','13512341234','jack@gmail.com',null)
insert into customer values (2,'customer2','rose','13512351235','rose@gmail.com',null)
表里面的数据如下:
4
编写控制器层
由于我们的项目使用servlet作为控制器层的实现技术,下面的工作就是根据url的定义来编写具体的servlet,如下图。
servlete比较多,以CustomerCreateServlet为例进行描述:
package org.jack.com.controller; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by jack on 2015/11/29. * 创建客户 */ @WebServlet("customer_create") public class CustomerCreateServlet extends HttpServlet { /* * 进入创建客户界面 * */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //to do something } /* * 处理 创建客户 请求 * */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); // to do something } }
继续了HttpServlet,所以需要引入Servlet的jar包的依赖,在pox.xml文件中添加如下代码。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.jack.com</groupId> <artifactId>chapter2</artifactId> <version>1.0.0</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--Servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> </project>需要注意的是,该servlet只有一个请求路径,但可以处理两种不同的请求类型。doGet用于处理GET请求,而doPost用于处理Post请求,他们对应的请求路径都是/customer_create。
在Servlet中,请求类型有GET,POST,PUT,DELETE,他们分别对应doGet,doPost,doPut,doDelete方法。
5 编写服务层
在标准的MVC架构中是没有服务层的,我们将该层作为衔接控制器与数据库之间的桥梁,可以使用接口和实现类来表达,在简单的情况下,无须使用接口,直接用类就可以了,并非所有情况都需要定义一个接口,要根据实际情况来做出选择。服务层如图:
其中CustomerService代码如下:
package org.jack.com.service; import org.jack.com.model.Customer; import java.util.List; import java.util.Map; import java.util.Objects; /** * Created by jack on 2015/11/29. * 提供客户数据服务 */ public class CustomerService { /* * 获取客户列表 * */ public List<Customer> getCustomerList(String keyword){ //to do something return null; } /* * 获取客户 * */ public Customer getCustomer(long id){ //to do something return null; } /* * 创建客户 * */ public boolean createCustomer(Map<String,Object> fieldMap){ //to do something return false; } /* * 更新客户 * */ public boolean updateCustomer(long id,Map<String,Object> fieldMap){ //to do something return false; } /* * 删除客户 * */ public boolean deleteCustomer(long id){ //to do something return false; } }
6
编写测试单元
使用Juit作为单元测试框架,需要在pom.xm中添加如下依赖:
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--<version>3.8.1</version>-->
<version>4.11</version>
<scope>test</scope>
</dependency>
然后在test/java中创建一个单元测试的类,org.jack.test.CustomerServiceTest,用于测试CustomerService类中的各个方法,如图:
代码如下:
package org.jack.test;
import org.jack.com.model.Customer;
import org.jack.com.service.CustomerService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by jack on 2015/12/5.
* 单元测试类CustomerServiceTest
*/
public class CustomerServiceTest {
private final CustomerService customerService;
public CustomerServiceTest(){
customerService = new CustomerService();
}
@Before
public void init(){
//to do 初始化数据库
}
@Test
public void getCustomerListTest() throws Exception{
List<Customer> customerList = customerService.getCustomerList("");
Assert.assertEquals(2,customerList.size());
}
@Test
public void getCustomerTest() throws Exception{
long id = 1;
Customer customer = customerService.getCustomer(id);
Assert.assertNotNull(customer);
}
@Test
public void createCustomerTest() throws Exception{
Map<String,Object> fieldMap = new HashMap<String, Object>();
fieldMap.put("name","customer100");
fieldMap.put("contact","John");
fieldMap.put("telephone","13512345678");
boolean result = customerService.createCustomer(fieldMap);
Assert.assertTrue(result);
}
@Test
public void updateCustomerTest() throws Exception{
long id = 1;
Map<String,Object> fieldMap = new HashMap<String, Object>();
fieldMap.put("contact","Eric");
boolean result = customerService.updateCustomer(1,fieldMap);
Assert.assertTrue(result);
}
@Test
public void deleteCustomerTest() throws Exception{
long id = 1;
boolean result = customerService.deleteCustomer(id);
Assert.assertTrue(result);
}
}
7.编写试图层
使用jsp充当视图层,在WEB-INF/view目录下存放所有的jsp文件,如图所示。
需要注意的是,推荐把jsp放到WEB-INF内部,而并非外部,因为用户无法通过浏览器地址栏直接请求放在内部的jsp,必须通过servlet程序进行转发(forward)和重定向(redirect)
以“创建客户”为例,在customer_create.jsp中编写如下代码:
<%--
Created by IntelliJ IDEA.
User: jack
Date: 2015/12/5
Time: 23:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>客户管理 - 创建客户</title>
</head>
<body>
<h1>创建客户界面</h1>
<%--TODO SOMETHING--%>
</body>
</html>
到这里,一个简单的web应用基本就开发完毕了,这只是一个简单的框架,在后面需要进行修饰。
相关文章推荐
- MySQL中的integer 数据类型
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- MySQL存储过程
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件