JavaWeb(二)MVC设计模式

基于MVC设计模式实现简单的Javaweb-注册登录功能 首先,对于MVC设计模式千万不要想的太过复杂,不然真的很坑的。 简单的理解就是: 1.View-视图层 用户从视图层提交请求到Controller-控制层 。 2.然后控制层接受到用户的请求会调用Model-模型层里面的方法访问数据库并且将返回的结果返回到控制层。 3.控制层接受到模型层从数据库中访问的结果并处理,之后根据处理结果跳转当相应的视图层页面。 这就是MVC 设计思... 阅读详情

1.MVC三层架构

M:Model>>>模型层:封装数据Java Bean;
V:View>>>视图层:jsp专注显示;
C:Controller>>>控制层:Servlet接收页面请求,找模型层处理,然后响应数据出去;
**好处:**分层,逻辑清楚,便于维护,扩展方便;【适用大型项目】
**缺点:**小型项目,代码稍多;
三层架构与MVC的关系
在这里插入图片描述

2.实战案例:学生管理系统

整个项目工程布局图

在这里插入图片描述
环境搭建,准备工作
第一步:1.数据库建表,添加数据;

mysql> create table stu(
    -> id int primary key not null auto_increment,
    -> name varchar(20),
    -> gender varchar(2),
    -> phone varchar(12),
    -> birthday date,
    -> hobby varchar(50),
    -> info varchar(200)
    -> );
Query OK, 0 rows affected

需要导入必要的jar包
在这里插入图片描述
2.数据库连接c3p0配置文件【c3p0-config.xml】
一般只需修改默认配置即可

<c3p0-config>
	<!-- default-config 默认的配置,  -->
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost/students</property>
    <property name="user">root</property>
    <property name="password">123456</property>
    
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>
  </default-config>
  
   <!-- This app is massive! -->
  <named-config name="oracle"> 
    <property name="acquireIncrement">50</property>
    <property name="initialPoolSize">100</property>
    <property name="minPoolSize">50</property>
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property>

    <!-- he's important, but there's only one of him -->
    <user-overrides user="master-of-the-universe"> 
      <property name="acquireIncrement">1</property>
      <property name="initialPoolSize">1</property>
      <property name="minPoolSize">1</property>
      <property name="maxPoolSize">5</property>
      <property name="maxStatementsPerConnection">50</property>
    </user-overrides>
  </named-config>
</c3p0-config>

3.封装JDBCUtil.java用来获取来连接,一般放在util包下

package Student.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtil {
	
	static ComboPooledDataSource dataSource = null;
	static{
		dataSource = new ComboPooledDataSource();
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	/**
	 * 获取连接对象
	 * @return
	 * @throws SQLException 
	 */
	public static Connection getConn() throws SQLException{
		return dataSource.getConnection();
	}
	
	/**
	 * 释放资源
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void release(Connection conn , Statement st , ResultSet rs){
		closeRs(rs);
		closeSt(st);
		closeConn(conn);
	}
	public static void release(Connection conn , Statement st){
		closeSt(st);
		closeConn(conn);
	}
	private static void closeRs(ResultSet rs){
		try {
			if(rs != null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			rs = null;
		}
	}
	
	private static void closeSt(Statement st){
		try {
			if(st != null){
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			st = null;
		}
	}
	
	private static void closeConn(Connection conn){
		try {
			if(conn != null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			conn = null;
		}
	}
}

4.同样在util包下创建一个TextUtil,用来判断字符是否为空

/**
 * @author Leonard
 *	判断一个字符串是否为空
 */
public class TextUtils {
	public static boolean isEmpty(CharSequence s){
		return s==null || s.length()==0;
	}
}

接下开始写项目了。。。。。。。。。。。。。。。。。
写项目
项目完成预览图
在这里插入图片描述
进入第一个列表
在这里插入图片描述
分页显示页面
在这里插入图片描述
第一步:创建jsp页面及对应的Servlet
1.创建index.jsp显示页面

<body>
	//超链接的地址是Servlet控制层
    <h3><a href="StudentListServlet">显示所有学生列表</a></h3><br>
    <h3><a href="StudentListPageServlet?currentPage=1">分页显示所有学生列表</a></h3>
</body>

StudentListServlet.java

public class StudentListServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try {
			StudentService service = new StudentServiceImpl();
			List<Student> list = service.findAll();
			//把结果存域
			request.getSession().setAttribute("list", list);
			//重定向方式,把结果存到session域需要
			response.sendRedirect("list.jsp");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doGet(request, response);
	}

StudentListPageServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//1.获取需要显示的页码数
			int currentPage = Integer.parseInt(request.getParameter("currentPage"));
			//2.根据指定页数获取该页数据回来;
			StudentService service = new StudentServiceImpl();
			PageBean pageBean = service.findStudentByPage(currentPage);
			request.setAttribute("pageBean", pageBean);
			//3.跳转页面
			request.getRequestDispatcher("list_page.jsp").forward(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

2.查询显示页面list.jsp

html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
      function doDelete(sid){
    	  var flag = confirm("是否删除?");
    	  if(flag){
    		  location.href="DeleteServlet?sid="+sid;
    	  }
      }
</script>
<title>学生列表页面</title>
</head>
<body>
	<form action="SearchStudentServlet" method="post">
	    <table border="1" cellspacing="0">
	        <tr>
	            <td colspan="8">
			                按姓名查询:<input type="text" name="sname">
			                &nbsp; &nbsp; &nbsp;
			                按性别查询:<select name="gender" >
	                     <option value="">--请选择--
	                     <option value="男">男
	                     <option value="女">女
	                     </select>
	                       &nbsp; 
	              <input type="submit" value="查询"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
	              <a href="add.jsp">添加</a>
	            </td>
	        </tr>
	        <tr>
	            <td>编号</td>
	            <td>姓名</td>
	            <td>性别</td>
	            <td>电话</td>
	            <!-- <td>生日</td> -->
	            <td>爱好</td>
	            <td>简介</td>
	            <td>操作</td>
	        </tr>
	        <c:forEach items="${list}" var="stu">
		        <tr>
		            <td>${stu.sid}</td>
		            <td>${stu.sname}</td>
		            <td>${stu.gender}</td>
		            <td>${stu.phone}</td>
		            <%-- <td>${stu.birthday}</td> --%>
		            <td>${stu.hobby}</td>
		            <td>${stu.info}</td>
		            <td><a href="EditServlet?sid=${stu.sid}">更新</a>  <a href="#" onclick="doDelete(${stu.sid})">删除</a></td>
		        </tr>
	        </c:forEach>
	    </table>
	</form>
</body>
</html>

SearchStudentServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try {
			//1.中文
			request.setCharacterEncoding("UTF-8");
			//2.获取前台数据
			String sname = request.getParameter("sname");
			String gender = request.getParameter("gender");
			
			//3.调用service
			StudentSe
JavaWeb:MVC设计模式 1、MVC设计模式MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。MVC可对程序的后期维护和扩展提供了方便,并且使程 阅读详情

相关推荐

JavaWeb MVC设计模式详述,mvc的小小案例

JavaWEB mvc 写Java Web项目时会发现,一个中型或者大型项目 随着代码的增多,会发现:代码既可以写在src目录下,也可以 写在WebContent目录下。src下可以建很多包 ,WebContent下可以建很多文件夹。 所以问题就来了:一个新的类 到底往哪个目录下的哪个文件夹里写? 此时解决办法就是:需要一个模式去规范,到底哪个类该往哪里写。 .MVC设计模式 Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念一样,我们再看一下Web MVC标准架构,如下图所 示:

qq_48783543的博客 910

JavaWeb之MVC设计模式

JavaWeb之MVC设计模式 写Java Web项目时会发现,一个中型或者大型项目 随着代码的增多,会发现:代码既可以写在src目录下,也可以 写在WebContent目录下。src下可以建很多包 ,WebContent下可以建很多文件夹。 所以问题就来了:一个新的类 到底往哪个目录下的哪个文件夹里写? 此时解决办法就是:需要一个模式去规范,到底哪个类该往哪里写。 1.mvc [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Uc20K91-1601194717875)(C:

王洋洋的博客 683

手把手教你学Simulink--基于火电发电系统的场景实例:燃煤发电机组的锅炉-汽轮机协调控制仿真

本文介绍了使用Simulink构建燃煤发电机组锅炉-汽轮机协调控制系统的仿真方法。系统包含锅炉子系统、汽轮机子系统和协调控制器三大模块,通过传递函数建模和PID控制策略实现协调控制。详细说明了从模型创建、子系统设置到控制器设计的完整流程,包括燃料供给、汽轮机模型和数据处理等关键环节。最后通过性能评估验证系统响应速度、参数稳定性和效率等指标。该仿真方法为火电系统控制策略设计和优化提供了有效工具。

MHD0815的博客 1153

PostgreSQL 超详细安装与使用教程:从入门到实战

本文将详细介绍PostgreSQL数据库的安装配置与基础使用。首先从Windows系统安装入手,分步骤讲解17.5版本的安装流程、环境变量配置及服务启动验证。接着重点介绍了pgAdmin4图形化管理工具的安装与使用,包括界面语言设置、数据库连接、创建与管理数据库等操作,同时对比了可视化操作与SQL命令两种方式。最后梳理了PgSQL基础语法,涵盖表的创建、增删改查操作、约束管理等内容,为初学者提供了完整的PostgreSQL入门指南。文章兼顾理论知识与实际操作,既适合数据库新手学习,也可作为开发人员的快速参考

gtf212的博客 1万+

PaddleOCR实战:从零开始打造专属OCR模型的完整指南

本文提供了一份从零开始使用PaddleOCR打造专属OCR模型的完整实战指南。内容涵盖环境搭建、数据标注与准备、模型训练与调优,以及最终的模型转换与部署。重点介绍了如何利用PaddleOCR进行模型训练,并整合PPOCRLabel等工具高效准备数据集,帮助开发者快速构建适用于特定场景的高精度OCR识别能力。

rl6adventurer的博客 733

SSTI模板注入及绕过姿势(基于Python-Jinja2)

http://xmctf.top:8962/?name={{%22%22[%22\x5f\x5fclass\x5f\x5f%22]["\x5F\x5Fbase\x5F\x5F"]["\x5F\x5Fsubclasses\x5F\x5F"]()[233]["\x5F\x5Finit\x5F\x5F"]["\x5F\x5Fglobals\x5F\x5F"]["\x5F\x5Fbuiltins\x5F\x5F"]['eval']("\x5F\x5Fimport\x5F\x5F('os'))")}}

Y4tacker的博客 1万+

【论文翻译】YOLO26: KEY ARCHITECTURAL ENHANCEMENTS AND PERFORMANCE BENCHMARKING FOR REAL-TIME OBJECT DETEC

本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其在实时边缘目标检测领域的关键架构改进与性能基准测试结果。YOLO26于2025年9月发布,是YOLO系列中最新、最先进的模型,专为在边缘设备和低功耗设备上实现高效能、高精度和部署就绪性而设计。论文依次详细介绍了YOLO26的架构创新,包括移除分布焦点损失(DFL)、采用端到端无非极大值抑制(NMS)推理、集成渐进式损失(ProgLoss)和小目标感知标签分配(STAL),以及引入MuSGD优化器以实现稳定收敛。

Limiiiing的博客 1690

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3091

SAP GR(Group Reporting)配置篇(五)

1.5、合并的货币换算1.5.1指定折算比率菜单路径组报表的SAP S4HANA >合并的货币换算>-指定折算汇率事务代码GCRF说 明1.5.2维护汇率菜单路径组报表的SAP S4HANA >合并的货币换算>维护汇率事务代码CXCC/OB08说 明实际测试的时候根据实际情况维护汇率。输入换算比率。1.5.3定义汇率标识符菜单路径组报表的SAP S4HANA >合并的货币换算>定义汇率标识符事务代码OC41说 明配置了月末汇率和平均汇率。

weixin_43853754的博客 554

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 事务 与 数据库连接池【c3p0】 与 DBUtiles的总结
下一篇: JavaWeb(三)Ajax与JQuery
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值