写Java Web项⽬时会发现,⼀个中型或者⼤型项⽬ 随着代码的增多,会发现:代码既可以写在src⽬录
下,也可以写在WebContent⽬录下。src下可以建很多包 ,WebContent下可以建很多⽂件夹。
所以问题就来了:⼀个新的类 到底往哪个⽬录下的哪个⽂件夹⾥写?
此时解决办法就是:需要⼀个模式去规范,到底哪个类该往哪⾥写。
MVC设计模式就是一种规范。
Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念⼀样,我们再看⼀下Web MVC标准架构,
如下图所示:
在Web MVC模式下,模型⽆法主动推数据给视图,如果⽤户想要视图更新,需要再发送⼀次请求(即请求-响应模型)。
M(Model) 模型 : 应⽤程序的核⼼功能,管理这个模块中⽤的数据和值(bean,dao
);
V(View )视图: 视图提供模型的展示,管理模型如何显示给⽤户,它是应⽤程序的外观;(jsp/html
)
C(Controller)控制器: 对⽤户的输⼊做出反应,管理⽤户和视图的交互,是连接模型和视图的枢纽。(servlet/service
)
下面就用代码简单实现一个MVC设计模式:
通过MVC设计模式,把数据库的数据展示到网页上。
依次创建bean包、dao包、service包、servlet包、util包。
package com.mvc.bean;
/**
* 实体类包 -- 主要存放和数据库对应的实体类
* 类名 = 表名
* 列名 = 属性名
* 实体类需要包含:属性,构造(无参,全参构造),setter/getter
* 此模块属于Model(M)
*/
public class Student {
private Integer id;
private String name;
private String gender;
private Integer age;
public Student() {
}
public Student(Integer id, String name, String gender, Integer age) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
package com.mvc.dao;
import com.mvc.bean.Student;
import java.util.List;
/**
* 实体类名+Dao == 当前类名
*/
public interface StudentDao {
//定义操作数据库的方法
public List<Student> getAll();
}
在dao包下创建impl包
package com.mvc.dao.impl;
import com.mvc.bean.Student;
import com.mvc.dao.StudentDao;
import com.mvc.util.DruidUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpl extends DruidUtil implements StudentDao {
@Override
public List<Student> getAll() {
List list = new ArrayList();
try {
String sql = "select * from student";
ResultSet resultSet = query(sql, null);
while(resultSet.next()){
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setGender(resultSet.getString("gender"));
student.setAge(resultSet.getInt("age"));
list.add(student);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return list;
}
}
ps:需要根据具体情况修改sql语句
package com.mvc.service;
import com.mvc.bean.Student;
import java.util.List;
/**
* bean名+Service == 当前类名
* service层主要定义业务逻辑层,现阶段主要是调取Dao层
*/
public interface StudentService {
//查询全部
public List<Student> getAll();
}
在service包下创建impl包
package com.mvc.service.impl;
import com.mvc.bean.Student;
import com.mvc.dao.impl.StudentDaoImpl;
import com.mvc.service.StudentService;
import java.util.List;
/**
* 调取Dao层的方法
* 属于C(Controller)控制层
*/
public class StudentServiceImpl implements StudentService {
private StudentDaoImpl studentDao = new StudentDaoImpl();
@Override
public List<Student> getAll() {
return studentDao.getAll();
}
}
创建类,继承HttpServlet
,重写其中的doGet()
和doPost()
(ps:重写在IDEA按下CTRL
+o
键)
package com.mvc.servlet;
import com.mvc.bean.Student;
import com.mvc.service.impl.StudentServiceImpl;
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.util.List;
/**
* 控制层(C) -- controller
*/
@WebServlet(urlPatterns = "/getstus")
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取参数
//2. 调取service
StudentServiceImpl service = new StudentServiceImpl();
List<Student> list = service.getAll();
//3. 跳转页面
//后台传递数据给前台
req.setAttribute("stulist",list);
req.getRequestDispatcher("/show.jsp").forward(req,resp);
}
}
util包是工具类包,适用于存放一些通用的类
这里使用的接口是德鲁伊连接数据库
package com.mvc.util;
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;
public class DruidUtil {
//1.定义需要的工具类对象
protected Connection connection = null;
protected PreparedStatement pps = null;
protected ResultSet rs = null;
protected int k = 0; //受影响的行数
private static String url;
private static String userName;
private static String password;
private static String dirverName;
//德鲁伊
private static DruidDataSource dds = new DruidDataSource();
//2.加载驱动
static {
//德鲁伊
ResourceBundle bundle = ResourceBundle.getBundle("db");
dirverName = bundle.getString("driver");
url = bundle.getString("url");
userName = bundle.getString("user");
password = bundle.getString("password");
dds.setUsername(userName);
dds.setPassword(password);
dds.setUrl(url);
dds.setDriverClassName(dirverName);
}
//3.获得连接
protected Connection getConnection() {
try {
//德鲁伊
connection = dds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//4.创建通道
protected PreparedStatement getPps(String sql) {
try {
getConnection();
pps = connection.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pps;
}
//5.给占位符赋值 list中保存的是占位符所赋的值
private void setParams(List list) {
try {
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
pps.setObject(i+1,list.get(i));
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//6.增删改调取的方法
protected int update(String sql,List params) {
try {
getPps(sql);
setParams(params);
k = pps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return k;
}
//7.查询的时候调取一个方法
protected ResultSet query(String sql,List list) {
try {
getPps(sql);
setParams(list);
rs = pps.executeQuery();
return rs;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//8.关闭资源
protected void closeAll(){
try {
if (rs != null) {
rs.close();
}
if (pps != null) {
pps.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
在这里还需要添加一个db.properties文件,这个文件是直接在src文件夹下创建
内容:
其中需要修改的地方是:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb2?serverTimezone=UTC
user=root
password=123456
ps:根据自己的数据库修改值
注意添加的lib包是在web->WEB-INF->lib
把需要的jar包拷贝到lib包下后,还需要引用它们
点击选中lib包,按右键选择Add as Library...
在index.jsp下添加如下信息:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$title>
head>
<body>
<a href="getstus">查询学生信息a>
body>
html>
其中a标签的地址是关联到servlet包中的注解
如果不使用注解的方式,也可以用另一种方法。
在web.xml配置文件添加地址路径:
例如:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>mvcservlet-name>
<servlet-class>
com.mvc.servlet.StudentServlet
servlet-class>
servlet>
<servlet-mapping>
<servlet-name>mvcservlet-name>
<url-pattern>/getstusurl-pattern>
servlet-mapping>
web-app>
添加show.jsp文件:
<%--
Created by IntelliJ IDEA.
User: hyh
Date: 2021/9/29
Time: 12:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Titletitle>
<script type="text/javascript" src="js/jquery-1.11.1.js">script>
<script type="text/javascript" src="js/bootstrap.js">script>
<link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.css" />
<link rel="stylesheet" type="text/css" href="css/mycss.css">
head>
<body>
<table class="table table-bordered">
<caption class="text-center">学生信息表caption>
<tr class="active">
<td>idtd>
<td>nametd>
<td>sextd>
<td>agetd>
tr>
<c:forEach items="${stulist}" var="stu">
<tr class="success">
<td>${stu.id}td>
<td>${stu.name}td>
<td>${stu.gender=="male"?"男":"女"}td>
<td>${stu.age}td>
tr>
c:forEach>
table>
body>
html>
点击运行后,启动Tomcat服务器
点击链接,就跳转到show.jsp编写的页面