具体原理在期末复习那一篇文章中,本文主要用于分享所有代码
控制层(Controller)在MVC中由Servlet文件来担任该角色,具体代码如下:
在运行时MVC文件时,在地址最后加上lisHero作为运行的url地址
即
则会运行到关键的页面中
package servlet;
import java.io.IOException;
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 dao.HeroDAO;
import bean.Hero;
/**
* Servlet implementation class AddServlet
*/
public class AddServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("AddServlet跳转成功");
// 设置request的编码格式
request.setCharacterEncoding("UTF-8");
// 获取请求传递来的数据
String name = request.getParameter("name");
int damage = Integer.parseInt(request.getParameter("damage"));
float hp= Float.parseFloat(request.getParameter("hp"));
// 设置Hero对象的成员变量的参数
Hero hero = new Hero();
hero.setDamage(damage);
hero.setHp(hp);
hero.setName(name);
// 调用HeroDAO()中的add(Hero hero)方法将数据进行添加
HeroDAO heroDAO = new HeroDAO();
heroDAO.add(hero);
// 重定向到listHero页面,进行显示
response.sendRedirect("listHero.jsp");
}
}
package servlet;
import java.io.IOException;
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 dao.HeroDAO;
import bean.Hero;
/**
* Servlet implementation class DeleteServlet
*/
public class DeleteServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取要删除信息的id
// 进行数据类型转换
int id = Integer.parseInt(request.getParameter("id"));
System.out.println("id="+id+"的数据成功删除");
// 调用HeroDAO中的删除方法
HeroDAO heroDAO = new HeroDAO();
heroDAO.delete(id);
}
}
package servlet;
import java.io.IOException;
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 dao.HeroDAO;
import bean.Hero;
/**
* Servlet implementation class EditServlet
*/
@WebServlet("/EditServlet")
public class EditServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("EditServlet跳转成功");
// edit要实现的功能无非是设置数据库中的具体数据
int id = Integer.parseInt(request.getParameter("id"));
HeroDAO heroDAO = new HeroDAO();
Hero hero = heroDAO.get(id);
// 向request对象中添加hero对象
request.setAttribute("hero",hero);
// 调用转发语句,转发到目标jsp页面,request对象不变
request.getRequestDispatcher("editHero.jsp").forward(request, response);
}
}
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Hero;
import dao.HeroDAO;
public class HeroListServlet extends HttpServlet {
// post/get请求方法都会调用service()方法
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
int start = 0;
int count = 5;
try {
// 从请求中获取start的值,实现翻页功能的核心代码
start = Integer.parseInt(request.getParameter("start"));
} catch (NumberFormatException e) {
// 当浏览器没有传参数start时
}
int next=start+count;
int pre = start-count;
int end;
// 末页的计算方相对复杂
// 首先获取数据的总数,调用DAO中的对应方法
HeroDAO heroDAO= new HeroDAO();
int total = heroDAO.getTotal();
// 没有余页时,即每一页都有count条数据
if (total%count==0){
end=total-count;
}
// 存在余页时
else{
end=total-total%count;
}
// 方法的重载,利用参数区别来实现参数的重载
// start为从request中获取到的
List<Hero> heros = new HeroDAO().list(start,count);
// 向请求中添加参数,实现参数的传递
request.setAttribute("next", next);
request.setAttribute("heros", heros);
request.setAttribute("pre", pre);
request.setAttribute("end", end);
//
request.getRequestDispatcher("listHero.jsp").forward(request, response);
}
}
package servlet;
import bean.Hero;
import java.io.IOException;
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 dao.HeroDAO;
/**
* Servlet implementation class InquireServlet
*/
public class InquireServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("InquireServlet跳转成功");
request.setCharacterEncoding("UTF-8");
// 获取请求中的数据
int id = Integer.parseInt(request.getParameter("id"));
HeroDAO heroDAO = new HeroDAO();
Hero hero = new Hero();
hero = heroDAO.get(id);
request.setAttribute("hero", hero);
//
request.getRequestDispatcher("inquireResult.jsp").forward(request, response);
}
}
package servlet;
import java.io.IOException;
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 bean.Hero;
import dao.HeroDAO;
/**
* Servlet implementation class UpdateServlet
*/
public class UpdateServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("UpdateServlet页面跳转成功")
// 设置request编码格式
request.setCharacterEncoding("UTF-8");
// 获取request请求中的数据
String name = request.getParameter("name");
int id = Integer.parseInt(request.getParameter("id"));
int damage = Integer.parseInt(request.getParameter("damage"));
float hp = Float.parseFloat(request.getParameter("hp"));
// 实现数据的修改
Hero hero = new Hero();
hero.setDamage(damage);
hero.setHp(hp);
hero.setId(id);
hero.setName(name);
// 对数据库中的信息进行更新
new HeroDAO().update(hero);
// 进行重定向,实现页面的跳转
response.sendRedirect("listHero");
}
}
Model(业务层)
package bean;
public class Hero {
public int id;
public String name;
public float hp;
public int damage;
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 float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
}
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.Hero;
public class HeroDAO {
public HeroDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root",
"123456");
}
public int getTotal() {
int total = 0;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select count(*) from hero";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
total = rs.getInt(1);
}
System.out.println("total:" + total);
} catch (SQLException e) {
e.printStackTrace();
}
return total;
}
public void add(Hero hero) {
String sql = "insert into hero values(null,?,?,?)";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void update(Hero hero) {
String sql = "update hero set name= ?, hp = ? , damage = ? where id = ?";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.setInt(4, hero.id);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void delete(int id) {
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "delete from hero where id = " + id;
s.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public Hero get(int id) {
Hero hero = null;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select * from hero where id = " + id;
ResultSet rs = s.executeQuery(sql);
if (rs.next()) {
hero = new Hero();
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.name = name;
hero.hp = hp;
hero.damage = damage;
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
return hero;
}
public List<Hero> list() {
return list(0, Short.MAX_VALUE);
// 方法的重载
// 用参数进行区别
// 调用下面的lis(int start,int conut)方法
}
public List<Hero> list(int start, int count) {
List<Hero> heros = new ArrayList<Hero>();
String sql = "select * from hero order by id asc limit ?,? ";
//这是一个SQL查询语句,用于从hero表中按id倒序排列并限制返回结果的数量。其中,问号表示需要通过PreparedStatement设置的参数。
//第一个问号表示偏移量(即从第几条记录开始返回),第二个问号表示返回的记录数量。这种使用PreparedStatement的方式可以有效地避免SQL注入攻击。
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
// 设置参数
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Hero hero = new Hero();
int id = rs.getInt(1);
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.id = id;
hero.name = name;
hero.hp = hp;
hero.damage = damage;
heros.add(hero);
}
} catch (SQLException e) {
e.printStackTrace();
}
return heros;
}
}
View(视图)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<!--对数据编辑完成之后,就可以对于数据库中的数据进行更新了-->
<form action="updateHero" method="post">
<!-- value的作用使初始值显示在输入框中-->
id:<input type="text" name="id" value="${hero.id }"><br>
name:<input type="text" name="name" value="${hero.name }"><br>
hp:<input type="text" name="hp" value="${hero.hp }"><br>
damage:<input type="text" name="damage" value="${hero.damage }"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>id</td>
<td>name</td>
<td>hp</td>
<td>damage</td>
</tr>
<tr>
<td>${hero.id}</td>
<td>${hero.name}</td>
<td>${hero.hp}</td>
<td>${hero.damage}</td>
</tr>
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>id</td>
<td>name</td>
<td>hp</td>
<td>damage</td>
<td>edit</td>
<td>delete</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st">
<tr>
<td>${hero.id}</td>
<td>${hero.name}</td>
<td>${hero.hp}</td>
<td>${hero.damage}</td>
<td><a href="editHero?id=${hero.id}">edit</a></td>
<td><a href="deleteHero?id=${hero.id}">delete</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="6" align="center">
<a href="?start=0">[首页]</a>
<a href="?start=${pre}">[上一页]</a>
<a href="?start=${next}">[下一页]</a>
<a href="?start=${end}">[末页]</a>
</td>
</tr>
</table>
<!-- 用于添加操作 -->
<form action="addHero" method="post" align="center">
name:<input type="text" name="name"><br>
hp:<input type="text" name="hp"><br>
damage:<input type="text" name="damage"><br>
<input type="submit" value="添加">
</form>
<!-- 用于查询操作 -->
<form action="inquireHero" method="post">
请输入要查询的Hero的id:<input type="text" name="id">
<input type="submit" value="查询">
</form>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录界面</title>
</head>
<body>
<!-- action中不要带/ -->
<form action="login" method="post">
name:<input type="text" name="name"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="登录">
<!--通过超链接跳转注册页面-->
<a href="register.jsp" class="button">【注册】</a>
</form>
</body>
</html>
具体web.xml映射文件(MVC模式下配置映射文件真的重复的一批)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HeroListServlet</servlet-name>
<servlet-class>servlet.HeroListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HeroListServlet</servlet-name>
<url-pattern>/listHero</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>deleteServlet</servlet-name>
<servlet-class>servlet.DeleteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>deleteServlet</servlet-name>
<url-pattern>/deleteHero</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>editServlet</servlet-name>
<servlet-class>servlet.EditServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>editServlet</servlet-name>
<url-pattern>/editHero</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>updateServlet</servlet-name>
<servlet-class>servlet.UpdateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>updateServlet</servlet-name>
<url-pattern>/updateHero</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>addServlet</servlet-name>
<servlet-class>servlet.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addServlet</servlet-name>
<url-pattern>/addHero</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>InquireServlet</servlet-name>
<servlet-class>servlet.InquireServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InquireServlet</servlet-name>
<url-pattern>/inquireHero</url-pattern>
</servlet-mapping>
</web-app>