Javaweb项目实战:
简单准备:
-
数据库建表语句:
CREATE TABLE User( id int(10) NOT NULL AUTO_INCREMENT, name varchar(30), age int(6) , gender char(6), birthday DATE, hobbies varchar(100), createtime DATE, updatetime DATE, PRIMARY KEY (id) ) ;
-
配置好Maven仓库环境
Maven仓库下载地址(直接搜索maven)https://mvnrepository.com/
下载完zip之后解压, 创建项目时进行配置
这边选用的是 apache-maven-3.6.3
-
准备好tomcat
-
同样是在Maven仓库下载zip直接解压就可以
这边选用的是 apache-tomcat-8.5.78
项目开始
创建Maven项目与子项目
(这边只是一个**非常简单的入门项目**所以不怎么需要使用模板的配置信息)
创建一个名为Servlet_Exam的多模块maven项目, 其中有三个子模块分别为
(每次Maven项目创建时都需要一段时间加载)
步骤一:项目创建于配置
-
父模块Servlet_Exam
- 父类模块创建完成后, 需要修改pom文件
-
配置Maven
File–>Setting–>搜索Maven
此时控制台输出 : BUILD SUCCESS
表示配置完毕
-
子模块: 基础模块Servlet_pojo
点击父模块文件–>创建新文件
子模块: 基础模块Servlet_dao与上面相同
子模块: web模块Servlet_web
创建时选择web模块,pom中的打包方式为war(模板默认)
-
步骤二:创建依赖关系
设置其依赖关系:
Servlet_web 依赖 Servlet_dao
Servlet_dao 依赖 Servlet_pojo
<!--Servlet_dao文件-->
<dependencies>
<dependency>
<groupId>com.huawei</groupId>
<artifactId>Servlet_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--Servlet_dao文件-->
<dependencies>
<dependency>
<groupId>com.huawei</groupId>
<artifactId>Servlet_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
步骤三: 子模块功能实现说明
基础模块Servlet_pojo
在该模块内定义一个bean,名称为User;
其相应的属性: id(整型) name(字符串) age(整型) gender(字符) birthday(日期) hobbies(字符串数组)
User类的创建
(注意: 增加了一个getHobbie()方法, 为后面获取使用)
package com.huawei.bean;
import java.util.Arrays;
import java.util.Date;
//model 或 bean 模型类 一般和数据库表一一关联
public class User {
private int id;//id
private String name;//姓名
private int age;//年龄
private char gender;//性别
private Date birthday;//生日
private String[] hobbies;//兴趣爱好
public User() {}
public User( String name, int age, char gender, Date birthday, String[] hobbies) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.birthday = birthday;
this.hobbies = hobbies;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String[] getHobbies() {
return hobbies;
}
public String getHobbie() {
String s = Arrays.toString(this.hobbies);
return s;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
@Override
public String toString() {
return "com.hw.User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", ender=" + gender +
", birthday=" + birthday +
", hobbies=" + Arrays.toString(hobbies) +
'}';
}
}
基础模块Servlet_dao
-
数据库使用mysql数据库:(开始的sql语句,创建后就不需要再次创建了)
CREATE TABLE User( id int(10) NOT NULL AUTO_INCREMENT, name varchar(30), age int(6) , gender char(6), birthday DATE, hobbies varchar(100), createtime DATE, updatetime DATE, PRIMARY KEY (id) ) ;
-
创建一张User表, 表中的字段分别为:
id 序号name 姓名
age 年龄gender 性别
birthday 生日
hobbies 兴趣爱好
createtime 创建时间(日期类型)
updatetime 修改时间(日期类型)
该模块主要用于定义数据库相关操作类与方法
该模块分别创建两个类: a. DBUtil b. UserDao -
a. DBUtil
在该类中封装jdbc连接mysql数据库方法(1. 数据库驱动获取方法 2.数据库关闭方法)
package com.huawei.util;
import java.sql.*;
public class DBUtil {
public static String url="jdbc:mysql://localhost:3306/mytest";
public static String driver = "com.mysql.jdbc.Driver";
//获取驱动
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据源
* @return
*/
public static Connection getConnection(){
try {
return DriverManager.getConnection(url,"root","root");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭数据方法
* @param rs
* @param st
* @param conn
*/
public static void close(ResultSet rs,Statement st,Connection conn){
if (rs!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//测试是否能获取到数据库数据源
Connection conn = getConnection();
System.out.println(conn);
}
}
//额外增加一个工具类用于录入数据库时的字符串数组与字符之间的转换
package com.huawei.util;
/**
* 工具类
*/
public class Tools {
public static String arraysToString(String[] strs){
String str = "";
for (String s: strs) {
str+=s+",";
}
str = str.substring(0, str.length()-1);
return str;
}
}
b. UserDao
在该类中封装: 1) 一个插入User对象到数据表的方法
1. createtime与updatetime两个字段值为当前时间,
符串固定值
-
插入的数据字符串类型使用中文
-
id为自动生成(对顺序无要求)
-
一个通过id来得到相应User对象的方法
package com.huawei.dao; import com.huawei.bean.User; import com.huawei.util.DBUtil; import com.huawei.util.Tools; import java.sql.*; import java.util.Arrays; public class UserDao { /** * 插入方法(插入user对象数据表) * @param user 需要插入的对象 * @return 返回是否成功 */ public static int insertUser(User user){ int n=0; String sql = "insert into user(name,age,gender,birthday,hobbies,createtime) values(?,?,?,?,?,now())"; Connection connection = DBUtil.getConnection();//获取连接 try { PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1,user.getName()); pst.setInt(2,user.getAge()); pst.setString(3,user.getGender()+""); //利用时间戳创建一个新的生气了的Date类 pst.setDate(4, new Date(user.getBirthday().getTime())); //使用工具类将其转化为字符串 pst.setString(5, Tools.arraysToString(user.getHobbies())); n=pst.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return n; } /** * 查询方法(通过id查询) * @param id 需要查询的id * @return 返回的对象 */ public static User findUserById(int id){ User user=null; String sql = "select * from user where id=?"; PreparedStatement pst=null; ResultSet rs=null; Connection conn = DBUtil.getConnection(); try { pst = conn.prepareStatement(sql); pst.setInt(1,id); rs = pst.executeQuery(); while (rs.next()){ //获取并设置对象的属性值 user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); user.setGender(rs.getString("gender").charAt(0)); user.setBirthday(rs.getDate("Birthday")); user.setHobbies(new String[]{rs.getString("Hobbies")}); } } catch (SQLException e) { e.printStackTrace(); }finally { DBUtil.close(rs,pst,conn); } return user; } }
web模块Servlet_web
这个模块我们使用了一个自己写的工具类
package com.huawei.servlet;
import com.huawei.bean.User;
import com.huawei.dao.UserDao;
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(value = "/update.do")
public class UpdateServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式 防止乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
int id =0;
String idStr = req.getParameter("id");
if (idStr!=null && idStr!=""){
id = Integer.parseInt(idStr);
}
UserDao userDao = new UserDao();
User user =UserDao.findUserById(id);
if (user!=null){
req.setAttribute("User",user);
req.getRequestDispatcher("/show.jsp").forward(req,resp);
}else {
resp.getWriter().println("该用户不存杂");
}
}
}
该模块用于前台展示信息
-
在index.jsp页面中定义一个form表单,该表单需要向后台传递用户信息
要求: 1)使用post方式 2)action: “insert”index.jsp创建
创建在web目录下: 包含一个表单
注意: jsp页面需要配置这一行在第一行,不然会乱码
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8" %>
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8" %> <html> <head> <meta charset="UTF-8"> <title>用户注册</title> </head> <body> <h2>用户注册</h2> <form action="insert.do" method="post"> 用户名: <input name="name"><br> 年龄: <input name="age"><br> 性别: <input name="gender" type="radio" value="男">男 <input name="gender" type="radio" value="女">女<br> 生日: <input name="birthday" type="date"><br> 爱好: <input name="hobbies" type="checkbox" value="看书">看书 <input name="hobbies" type="checkbox" value="打篮球">打篮球 <input name="hobbies" type="checkbox" value="打游戏">打游戏 <input name="hobbies" type="checkbox" value="打酱油">打酱油<br> <input type="submit"><br> </form> </body> </html>
-
创建一个InsertServlet类,继承HttpServlet类
在该类相关方法中实现从前台获取数据,传递给Dao层进行插入
备注: a. 请求路径: http://localhost:8088/insert
b. 需要处理中文问题
c. 插入成功,向前台返回"数据已成功录入!"InsertServlet创建
用于响应表单中的数据,将表单中的数据插入到数据库中
使用的是工具包中的插入方法, 我们写的插入方式是插入成功就是返回1, 插入失败返回0
package com.huawei.servlet; import com.huawei.bean.User; import com.huawei.dao.UserDao; import com.huawei.util.DateTools; import org.apache.catalina.realm.UserDatabaseRealm; import javax.servlet.ServletException; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 用于处理表单中提交过来的信息 * 将信息转化为User对象 并传入数据库 */ @WebServlet(value = "/insert.do") public class InsertServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置编码格式 防止乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=UTF-8"); //获取表单中的信息 String name = req.getParameter("name"); String age = req.getParameter("age"); String gender = req.getParameter("gender"); String birthday = req.getParameter("birthday"); //接收到的是一个数组 String[] hobbies = req.getParameterValues("hobbies"); //User对象赋值 User user = new User(); user.setName(name); //字符串转数字 //前提是字符串不为空 也不为空串 if (age!=null && age!=""){ int nl = Integer.parseInt(age); user.setAge(nl); }else{ user.setAge(18); } //性别是字符串转char 取第一个 user.setGender(gender.charAt(0)); user.setBirthday(DateTools.dataStrToDate(birthday)); user.setHobbies(hobbies); //失败返回 0 未失败返回1 if (UserDao.insertUser(user)>=1){ resp.getWriter().println("数据已录入"); }else{ resp.getWriter().println("数据录入失败"); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
-
创建一个home.jsp页面
该页面定义一个form表单,用于输入用户id查询相应用户信息
要求: 1)使用get方式
2)action: “update”home.jsp创建
主要的还是一个表单: 输入id后转交给servlet处理
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>查询</title> </head> <body> <form action="update.do" method="get"> 请输入编号:<input name="id" ><br> <input type="submit"><br> </form> </body> </html>
-
创建一个UpdateServlet类,继承HttpServlet类
该类用于返回用户信息
要求: 1) 如果查询到了用户,就将信息返回至前台
2) 如果查询不到用户,就向前台返回"该用户不存在"UpdateServlet类创建
使用工具类中我们的查询id方法来进行查询
package com.huawei.servlet;
import com.huawei.bean.User;
import com.huawei.dao.UserDao;
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(value = "/update.do")
public class UpdateServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式 防止乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
int id =0;
String idStr = req.getParameter("id");
if (idStr!=null && idStr!=""){
id = Integer.parseInt(idStr);
}
UserDao userDao = new UserDao();
User user =UserDao.findUserById(id);
if (user!=null){
req.setAttribute("User",user);
req.getRequestDispatcher("/show.jsp").forward(req,resp);
}else {
resp.getWriter().println("该用户不存杂");
}
}
}
到这里我们的代码部分就写完啦~ _
步骤四: 创建远程仓库
在码云创建名为"Servlet_Exam"的仓库,仓库设置为公开仓库而非私有;
并使用remote方式将本地仓库与远程仓库进行连接;
在本地创建.gitignore文件并对其进行配置;
.gitignore配置要求:
将本地项目上传至远程仓库
首先我们登录到我们的码云官网
然后新建仓库
起一个好听的库名就可以点击创建了~(建议使用这里规定的仓库名)
然后选择这两个
我们选择Git
这个时候文件就会全部变为红色: 说明Git添加成功(所有的文案都纳入了git版本管理)
先创建过滤文件.gitignore文件
用于指定特定的文件上传和特定的文件不能上传
!*.java
!Servlet_web/pom.xml
!*.jsp
!*.html
/.idea/
/target/
*.iml
将项目和git远程仓库关联
下一步就是连接远程仓库(有多种方法可以连接,这边我们用命令行这种)
点击图片中这个位置(需要安装linux命令行插件Gow)
输入连接代码
git remote add origin 仓库的地址
然后使用命令查看连接状态
git remote -v
然后就可以直接push了