该文章是我通过阅读书籍《架构探险:从零开始写javaweb框架》来写的demo。
本书的第一章《从一个简单的Web应用》,从第一章开始,按照书籍中的步骤,我一步步搭建该项目,并将搭建过程记录下来以供后续参考。
通过该书,可以学到如下内容:
- 使用IDEA搭建并开发Java项目。
- 使用Maven自动化构建Java项目
- 使用Git管理项目源代码
创建一个简单的web应用
创建MAVEN项目
调整Maven配置
在调整pom.xml项目时,建议使用Import Changes, 这样更可控
在Pom.xml中设置UTF-8编码格式
<?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.example</groupId>
<artifactId>javaweb01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 使用UTF-8进行编码 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
调整Maven配置
将Maven项目调整为Web项目
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
</web-app>
添加Java Web的Maven依赖
1.Maven依赖的“三坐标”(groupId、artifactID、version)
2.如果某些依赖只需参加编译,无须打包,可将其scope设置为provided
3.如果某些依赖只是运行时需要,但无须参与编译,可将其scope设置为runtime
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
编写一个简单的Web应用
创建HelloServlet.java类,实现doGet方法
package leo.javaweb;
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;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = dateFormat.format(new Date());
req.setAttribute("currentTime",currentTime);
req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
}
}
其中快捷键技巧:
编写JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>时间!</h1>
<h2>${currentTime}</h2>
</body>
</html>
运行项目
将代码放入Git仓库中
在根目录下创建.gitignore文件
# Maven #
target/
# IDEA #
.idea/
*.iml
# Eclipse #
.settings/
.metadata/
.classpath
.project
Servers/
提交到本地仓库
为Web应用添加业务功能
首先按照如下目录创建一个简单的web应用创建
接下来创建数据库
CREATE TABLE `customer`(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) DEFAULT NULL,
`contact` VARCHAR(255) DEFAULT NULL,
`telephone` VARCHAR(255) DEFAULT NULL,
`email` VARCHAR(255) DEFAULT NULL,
`remark` text,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT charset=utf8;
插入两条数据
INSERT INTO customer(id,name,contact,telephone,email,remark) VALUES(1,'customer1','Jack','13512345678','[email protected]',null);
INSERT INTO customer(id,name,contact,telephone,email,remark) VALUES(2,'customer2','Rose','13623456789','[email protected]',null);
编写模型层
public class Customer{
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;
}
}
编写控制器层
构建如下文件结构
首先编写控制器层
package org.chapter2.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;
@WebServlet("/customer_create")
public class CustomerCreate extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
编写服务层
MVC中没有服务器层,我们将该层作为衔接控制器和服务器之间的桥梁,使用和实现类来表达
package org.chapter2.service;
import org.chapter2.model.Customer;
import java.util.List;
import java.util.Map;
public class CustomerService {
/**
* 通过关键值
* 获取客户列表
*/
public List<Customer> getCustomerList(String keyword){
return null;
}
/**
* 通过id
* 获取客户
*/
public Customer getCustomer(long id){
return null;
}
/**
* 传入map值
* 创建客户
*/
public boolean createCustomer(Map<String,Object> fieldMap){
return false;
}
/**
* 根据id和fieldMap
* 更新客户
*/
public boolean updateCustomer(long id,Map<String,Object> fieldMap){
return false;
}
/**
* 根据id
* 删除客户
*
*/
public boolean deleteCustomer(long id){
return false;
}
}
推荐将JSP放在WEB-INF目录下,用户无法直接通过浏览器地址直接请求访问JSP,必须通过Servlet的forward和redirect.