架构探险:从零开始写javaweb框架 (一)

该文章是我通过阅读书籍《架构探险:从零开始写javaweb框架》来写的demo。

本书的第一章《从一个简单的Web应用》,从第一章开始,按照书籍中的步骤,我一步步搭建该项目,并将搭建过程记录下来以供后续参考。

通过该书,可以学到如下内容:

  • 使用IDEA搭建并开发Java项目。
  • 使用Maven自动化构建Java项目
  • 使用Git管理项目源代码

创建一个简单的web应用

创建MAVEN项目

image-20200214150144873

调整Maven配置

在调整pom.xml项目时,建议使用Import Changes, 这样更可控

image-20200214150309118

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项目

image-20200214184727870

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);

    }
}

其中快捷键技巧:

image-20200214162712640

image-20200214162657343

编写JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    <h1>时间!</h1>
    <h2>${currentTime}</h2>
</body>
</html>

运行项目

image-20200214185906972

image-20200214185922454

将代码放入Git仓库中

在根目录下创建.gitignore文件

# Maven #
target/

# IDEA #
.idea/ 
*.iml

# Eclipse # 
.settings/ 
.metadata/ 
.classpath
.project 
Servers/

提交到本地仓库

image-20200214192940179

为Web应用添加业务功能

image-20200214214456031

首先按照如下目录创建一个简单的web应用创建

image-20200214214001744

接下来创建数据库

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;
    }
}

编写控制器层

构建如下文件结构

image-20200214233417552

首先编写控制器层

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.

image-20200215002311093

猜你喜欢

转载自www.cnblogs.com/zhichun/p/12638897.html
今日推荐