# Java Web项目
**Repository Path**: dlzys/javaweb_teaching_project
## Basic Information
- **Project Name**: Java Web项目
- **Description**: 该项目是基于MVC的Java Web基础教学项目,不涉及前端内容。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 56
- **Created**: 2018-09-14
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Java Web教学项目
#——基于MVC的博客网站设计与实现
该项目是基于MVC的Java Web基础教学项目,不涉及前端内容。相关的前端内容请访问同账号的其他项目。
该项目为至少要运行在JDK1.8环境中,建议运行在JDK 9或JDK 10中;服务器建议使用tomcat 9或Jetty 12版本。
## 软件架构
最基础的MVC模式:JSP+Servlet+JavaBean结构
使用JSTL/EL、原生AJAX等技术。
## 前置任务列表
完成该项目需要一些首先完成一些前置任务。在掌握前置任务之后,才能完成该项目
### 1,构建基于maven的项目
构建基于maven的web项目,第三方jar包依赖于中央仓库。
配置maven\conf\settiong.xml文件
修改本地仓库的地址;新增镜像仓库地址
```
E:\yuhf\.m2\repository
```
```xml
alimaven
central
aliyun maven
http://maven.aliyun.com/nexus/content/repositories/central/
```
配置pom.xml文件
```xml
4.0.0
edu.yuhf
blogServer
0.0.1-SNAPSHOT
org.apache.maven.plugins
maven-war-plugin
3.1.0
false
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
org.apache.maven.plugins
maven-war-plugin
src/main/webapp
true
WEB-INF
org.eclipse.jetty
jetty-maven-plugin
9.4.5.v20170502
10
9000
/
src/test/resources/webdefault.xml
javax.servlet
javax.servlet-api
3.1.0
provided
jstl
jstl
1.2
javax.servlet.jsp
javax.servlet.jsp-api
2.2.1
provided
junit
junit
4.12
test
log4j
log4j
1.2.17
commons-fileupload
commons-fileupload
1.2.2
com.oracle
ojdbc6
12.1.0
com.alibaba
fastjson
1.2.49
war
```
### 2,利用Git控制项目版本
学会使用Git软件的用法,并确定远程仓库。本文建议使用码云。
### 3,引入数据库访问工具类
#### 工具类
创建如下:java文件,完成数据库访问代码封装和优化,实现数据库连接信息软编码。
完成对一般的数据库操作(CRUD)的封装。可以返回实体类实例。
DBConnection.java
```java
static{}
public Connection getConnection();
public void closeConnection(Connection connection);
```
JdbcTemplate.java
```java
public List query(String sql,ResultSetHandle rsh,Object...param);
public int queryForCount(String sql,Object...param);
public int update(String sql,Object...param);
```
ResultSetHandler.java --接口
TransactionManager.java
```java
public class TransactionManager {
public void beginTranscation() {} //开启事务
public void commitAndClose() {} //提交并关闭事务
public void rollbackandClose() {} //回滚并关闭事务
}
```
jdbc.properties配置文件
#### 引入log4j日志系统
首先在pom.xml文件中添加依赖
```
log4j
log4j
1.2.17
```
之后添加log4j.properties配置文件
```
log4j.rootLogger=debug,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p - %m%n
```
最后在每个要进行日志输出的类中的加入Logger的声明。如下:
```java
private static Logger log=Logger.getLogger(DBConnection.class);
...
log.debug("....");
log.error("....");
```
#### 事务控制处理
增加了事务控制类,为此要对数据库连接类进行一些修改。
主要的目的是实现线程和connection引用对象的统一。关键是使用ThreadLocal类。ThreadLocal类的数据结构是Map。键是线程id,值可以放任何对象。
### 4,数据库设计和表空间创建
使用PowerDesigner软件设计数据库的物理模型。基本参照如下:
1,用户信息管理模块:用户表、用户详情表、行政区划表、爱好表
2,文章信息管理模块:文章分类表、文章信息表
3,用户权限管理模:角色表、权限表、用户角色表、角色权限表

要求完成基本的设计工作,生成pdm文件。
#### 创建表空间和用户
```sql
create tablespace nnblog
datafile 'D:\app\Administrator\oradata\orcl\nnblog.dbf'
size 100m autoextend on next 20m;
create user nnblog identified by nnblog default tablespace nnblog;
grant connect to nnblog;
grant resource to nnblog;
```
### 5,主页面布局准备
基于Grid,构建主页页面
## 项目细分任务列表
### 任务一,登录流程
####1,简单登录(不连接数据库)
创建不带数据库验证的用户登录流程。熟悉web开发中的基于MVC设计模式的开发流程。
注意,登录流程实际上包含两个相互独立的流程。
index.jsp-->init.servlet-->login.jsp 流程1
login.jsp-->user.servlet-->login.jsp或veiws/main.jsp 流程2
说明:尽量不要出现在页面直接转向另一个页面的情况。
#### 2,登录流程附加功能
在用户登录流程中,加入session验证、cookie校验功能。
1,session验证:用session保护所有需要身份验证才能访问的页面。
知识点:session、Filter
2,cookie验证:往访问者本机存入一个文本,称作cookie。任何网站都可以访问这些cookie。
知识点:cookie
综合知识:session和cookie区别?
3,Filter的概念和应用方法
知识点:AOP、过滤器的的应用、chain.doFilter()、过滤器链等
####3,表的创建工作
完成数据库的创建,创建nnblog表空间,创建nnblog用户并授权,创建users表,并添加部分数据。
```sql
//创建用户表
create table users(
id number(10) primary key,
name varchar2(50) not null,
nickName varchar2(80) not null,
password varchar2(50) not null,
sex char(1) default '1',
email varchar2(100)
);
alter table USERS add unique (NAME)
select * from users;
create sequence users_id start with 0 increment by 1 minvalue 0 maxvalue 99999999;
insert into users values(users_id.nextval,'admin','我是老大','admin','1','albert@qq.com');
insert into users values(users_id.nextval,'test','深情的维那斯','test','0','john@qq.com');
commit;
```
以上创建工作全部手写完成,源代码文件放入项目文件中。
####4,登录流程_增强
加入service(业务部分)、dao(数据访问部分)及任务4中的数据库访问工具类。
service、dao都必须基于接口、且进行专门的单元测试。
```java
UserService 接口
UserServiceImpl 实现
UserDao 接口
UserJdbcDaoImpl 实现
UserServiceImplTest
UserJdbcDaoImplTest
```
Dao负责访问数据库,并最终返回数据。注意返回的数据不能是ResultSet之类的java.sql中的类。一般返回的domain对象或者是集合、数组等。
Service负责业务逻辑。
#####单元测试
所谓单元指的方法,也就是说,代码中所有的方法都有一个对应的测试方法;所有的类都要有一个对应的测试类。当然Servlet目前无法测试,在使用Spring框架之前,主要测试对象Service类中的方法和Dao类中的方法。
添加JUnit.jar依赖
```
junit
junit
4.12
test
```
在测试方法上加上@Test注解。
#### 5,登录用户检查
引入过滤器的概念,并在项目中加入过滤器,以演示过滤器的实际作用。
1,编码转换过滤器
2,session验证过滤器
引入监听器的概念
1,完成用户重复登录,之前登录的用户被踢掉的功能。使用ServletContext类。
2,用户被踢掉时,给用户相应提示并且立即返回到登录页面。
完成一个用户登录时间记录,记录到数据库中,利用Filter完成。
1,建立online表,记录用户登录时间。
2,建立过滤器,在适当的位置过滤相关数据,存入数据库。
### 任务二,注册流程
#### 1,创建相应的表结构
创建相应的数据库表,包括:用户详情表、爱好信息表、行政区划表
```sql
create table userDetail(
id number(10) primary key,
nativeplace_code varchar2(6) references nativePlace(code),
hobby_code varchar2(50),
userId number(10) references users(id)
);
create table hobby(
id number(10) primary key,
name varchar2(50),
code number(2) unique
);
create sequence hobby_id start with 0 increment by 1 minvalue 0;
create table nativePlace(
id number(10) primary key,
name varchar2(50) unique,
code varchar2(6)
);
alter table NATIVEPLACE add constraint unique1 unique (CODE);
```
####2,注册任务细化
1,编写用户注册页面,主要注册信息包括:用户名、昵称、密码、性别、爱好、来自于和Email。
2,在登录页面点击注册按钮,通过user.servlet?param=register转向注册页面。
3,在servlet中收集所需要的信息,包括:爱好信息,来自于的省级信息等。
4,在register.jsp页面中显示相关信息。
5,在省级下拉列表变化时,市级下拉列表显示相对应的信息。(利用ajax完成)
AJAX技术、ESM(ECMAScript Module)
6,提交form表单到服务器端
7,服务端根据提交信息写入数据库,完成用户注册。
####3,注册流程
```
graph LR(注册页面显示流程)
节点1(login.jsp)-->节点2(UserServlet)-->节点3(register.jsp)
graph LR(注册流程)
节点1(register.jps)-->节点2(UserServlet)-->节点3(InitServlet)-->节点4(login.jsp)
```
####4,相关知识点解析
1,在UserServlet中有两个注册相关的流程控制关键字:register、doRegister
register关键字是单纯的转向;doRegister是真正的注册操作。
后面的的update和doUpdate关键字效果和这个一样。
2,存储转发和重定向的功能及区别
3,JSTL,Java自定义标签。自定义标签虽然像标签,但本质是一个Java类。
引入自定义标签
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
```
4,${}指的是EL表代式。EL是用来在页面展示数据的一种编程语言。
5,原生AJAX的使用和封装技术。
6,JS模块化技术IIFE、CMD、AMD、ESM。这里只讲解了ESM技术(2018年5月之后的主流浏览器开始支持)。
### 任务三,用户信息管理页面控制
完成用户信息管理页面的开发任务
####1,管理页面的任务细化
1,构建基础页面,显示用户信息。用户信息从users表、userDetail表及NativePlace表中获取。还要在Hobby表通过业务代码进行相应的转换处理。
利用List