Java 简单登录MVC
构建一个简单的基于MVC模式的JavaWeb
MVC设计模式是目前使用得比较多的一种设计模式,最早出现在Smalltalk中,后来广泛应用于Java Web 应用程序中。Model(模型)表示业务逻辑层,View(视图)代表表示层,Contraller(控制器)代表控制层!
在Java Web应用程序中,View部份一般用JSP和HTML构建。客户在View部份提交请求,在业务逻辑层处理后,把处理结果又返回给View部份显示出来。因此,View部份也是WEB应用程序的用户界面!
Controller部份一般由Servlet组成。当用户请求从View部分传过来时,Controller把该请求发给适当的业务逻辑组件处理,请求处理完成后,又返回给Controller.后者再把处理结果转发给适当的View组件显示。因此,Controller在视图层与业务逻辑层之间起到了桥梁作用,控制了它们两者之间的数据流向!
Model部分 包括业务逻辑层和数据库访问层。在JAVA WEB 应用程序中,业务逻辑层一般由JAVABEAN或EJB构建。EJB是J2EE的核心组件,可以构建分布式应用系统。与普通的JAVABEAN不同,它由二个接口和一个实现类组成,并且包含一些固有的用于控制容器生命周期的方法!
数据访问层也叫数据持久层,它主要负责与库打交道,用于从数据库中存取数据。在JAVA WEB应用中,我们常用JDBC API或Hibernate来构建数据持久层。例如,把与数据连接的代码以从数据库中存取数据的代码封装在不同的对象中,这样便于系统中其他业务逻辑组件调用它们。
这样,一个JAVA WEB应用程序划分为表示层,控制层,业务逻辑层和数据持久层,形成了一个多层系统。对于大型,复杂的WEB应用程序,这样的是十分必要的!
下面来构建一个简单的基于MVC模式的JAVA WEB应用程序,我们按照MVC设计模式,用JSP,Servlet及Java Bean构建一个简单的登录系统。该系统要求当用户在登录页面上输入用户名和密码并提交后,系统将检查该用户中否已经注册,如果该用户已经注册,系统进入主页面,否则进入注册页面!
我们将 按以下步骤构建这个系统:
Step1:数据库的设计,使用MySQL作为数据库,构建数据表T_UserInfo;
Step2:构建视图组件:登录页面login.jsp,主页面main.jsp,以及注册页面register.jsp;
Step3:构建控制层组件,一个Servlet,;取名为LoginServlet.java;
Step4:构建业务逻辑层组件(Model组件),一个JavaBean,取名为LoginHandler.java;
Step5:构建数据访问层组件:珍上数据访问类,取名dbPool.java;
Step6:编译,打包程序;
Step7:部署该程序到Web服务器Tomcat中,然后运行!
该系统的工作流程图如下:

详细设计:
A:用户登录涉及数据库操作的用例!我们在MySQL中 建立一个T_UserInfo表,DDL语句如下:
create table T_UserInfo
(
ID bigint primary key auto_increment,
userName varchar(20),
userPwd varchar(20)
)
--并添加一条测试数据用户名及密码均为fengyan
insert into T_UserInfo(userName,userPwd) values('fengyan','fengyan')B:构建视图组件,由前面的分析可知本例有三个视图组件,分别是登录页面login.jsp,主页面main.jsp,以及注册页面register.jsp.它们之间的关系是当用户在登录页面login.jsp上填入用户名及密码并提交后,系统将 检测该用户是琐已经注册,如果已经注册则进入main.jsp,否则进入注册页面!
login.jsp代码如下:
<%@ page language="java" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
<head>
<html:base />
<title>login.jsp</title>
</head>
<body>
<form action="servlet/LoginServlet" method="post" >
<table border="0">
<tr>
<td>Login:</td>
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="userPwd" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="login"></td>
</tr>
</table>
</form>
</body>
</html:html>
当用户按下登录后就提交给叫做LoginServlet的Servlet,以做进一步处理!
为方便起见,主页面main.jsp的内容设计的很简单。当用户登录成功后,系统转入main.jsp告诉用户已经登录成功,现已进入主页面。main.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<%=session.getAttribute("userName") %>,你成功登录,现已进入主页面!
</body>
</html>注册页面,register.jsp的内容也设计的很简单。当用户登录失败后,系统进入register.jsp,告诉用户登录失败,代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<%=session.getAttribute("userName") %>,你未能成功登录,现进入注册页面,请注册你的信息!
</body>
</html>C:构建数据访问组件,先创建一个属性文件db.properties用于设置库连接信息代码如下:
DBDriver=com.mysql.jdbc.Driver
Connection=jdbc:mysql://localhost:3306/study
User=root
Password=root本用例的数据访问组件是DbPool,代码如下:
package data;
/**
* 数据访问组件
* @author fengyan
* @date 2007-01-06 03:25
*/
*/
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DbPool {
private static DbPool instance = null;
private DbPool()
{
super();
}
//取得连接
public static synchronized Connection getConnection()
{
if(instance == null)
instance = new DbPool();
return instance._getConnection();
}
private Connection _getConnection()
{
try
{
String dBDriver = null;
String connectionUrl = null;
String user = null;
String password = null;
Properties p = new Properties();
InputStream inStream = getClass().getResourceAsStream("db.properties");
p.load(inStream);
dBDriver =p.getProperty("DBDriver",dBDriver);
connectionUrl = p.getProperty("Connection",connectionUrl);
user = p.getProperty("User","");//默认值为空
password = p.getProperty("Password","");
//加载驱动
Class.forName(dBDriver).newInstance();
return DriverManager.getConnection(connectionUrl+"?user="+user+"&password="+password);
}catch(Exception e)
{
System.out.println(e);
return null;
}
}
//释放资源
public static void DBClose(Connection con ,PreparedStatement ps,ResultSet rs)
{
try
{
if(rs != null)
rs.close();
if(ps != null)
ps.close();
if(con != null)
con.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
DbPool先从一个属性文件db.properties中获取数据库驱动程序名,URL,用户名和密码,然后利用这些信息连接数据库,取得连接!
D:构建模型组件,本用例的模型组件(或称为业务逻辑组件)是LoginHandler,代码如下:
package model;
/**
* 模型组件
* @author fengyan
* date 2007-01-06 03:27
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import data.DbPool;
public class LoginHandler {
Connection con;
PreparedStatement ps;
ResultSet rs;
//检查是否已经注册
public boolean checkLogin(ArrayList arr)
{
//从数据访问组件中取得连接
con = DbPool.getConnection();
//得到Controller传入的用户输入的用户名及密码
String userName = (String)arr.get(0);
String userPwd = (String)arr.get(1);
String strSql = "select * from T_UserInfo where userName=? and userPwd=?";
try
{
ps = con.prepareStatement(strSql);
ps.setString(1,userName);
ps.setString(2, userPwd);
rs = ps.executeQuery();
if(rs.next())
{
//释放资源
DbPool.DBClose(con, ps, rs);
return true;
}
else
{
//释放资源
DbPool.DBClose(con, ps, rs);
return false;
}
}catch(Exception e)
{
System.out.println(e);
return false;
}
}
}
E:本用例的控制组件是一个Servlet,叫做LoginServlet,代码如下
package controller;
/**
* 控制器
* @author fengyan
* date 2007-01-06 03:29
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.LoginHandler;
public class LoginServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html;charset=GBK";
public LoginServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从请求中取出用户名和密码
String userName = request.getParameter("userName");
String userPwd = request.getParameter("userPwd");
//生成一个ArrayList对象,并把用户名和密码的值存入该对象中
ArrayList arr = new ArrayList();
arr.add(userName);
arr.add(userPwd);
//生成一个Session对象
HttpSession session = request.getSession(true);
session.removeAttribute("userName");
session.setAttribute("userName", userName);
//调用模型组件
LoginHandler login = new LoginHandler();
boolean flag = login.checkLogin(arr);
//如果已注册
if(flag)
{
response.sendRedirect("/MVC/main.jsp");
}
else
{
response.sendRedirect("/MVC/register.jsp");
}
}
public void init() throws ServletException {
// Put your code here
}
}
该组件先处理Http POST请求,然后调用模型组件或业务逻辑组件LoginHandler检查该用户是否已注册如注册,则转入main.jsp,否则转入register.jsp,另外,Servlet都要在web.xml中声明,
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>/login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>controller.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
</web-app>
到此,整个系统完成设计!运行结果达到我们预期的的效果!
总结:上面结合使用JSP,Servlet和JavaBean构建了一个简单的基于MVC模式的登录系统。但我们看到在用这种方式构建的Java Web 应用系统中,控制器LonginController中包含重定向页面的名称,如下:
if(flag)
{
response.sendRedirect("/MVC/main.jsp");
}
else
{
response.sendRedirect("/MVC/register.jsp");
}这样会使系统的视图组件与控制层组件耦合很紧密,不便于系统的扩展和维护。对于大型Java Web系统,这样的紧密耦合性会合系统的扩展和维护变的十分困难。为了解决这些问题,一些优秀的MVC框架出现了,而Struts就是其中应用最普遍的一个。
Java 简单登录MVC的更多相关文章
- Java简单登录图形界面
本文参考与:https://blog.csdn.net/wyf2017/article/details/78831744 https://blog.csdn.net/MengKun822/articl ...
- AsMVC:一个简单的MVC框架的Java实现
当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...
- 简单登录注册实现(Java面向对象复习)
简单登录注册的实现(面向对象的复习) 需求: 设计用户类,包含用户名和密码两个属性 设计LoginDemo类设计用户登录方法 用户有三次登录机会,如果连续三次登录失败则退出程序 功能实现页面: ...
- 玩转spring boot——简单登录认证
前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...
- 【SSH进阶之路】Struts基本原理 + 实现简单登录(二)
上面博文,主要简单的介绍了一下SSH的基本概念,比較宏观,作为刚開始学习的人可以有一个总体上的认识,个人觉得对学习有非常好的辅助功能.它不不过一个"瞭望塔".更是检验是否真正掌握全 ...
- Struts基本原理 + 实现简单登录(二)
MVC 概念 MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,知道这么多就够了. 大家都知道SUN公司对于MVC模 ...
- 纯JSP实现简单登录跳转
1.JSP介绍 JSP即Java Server Pages,JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑.网页还能通过tags和script ...
- 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)
新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
随机推荐
- 修复ecshop商品重量BUG小数位增至五位
如果ECSHOP商品重量录入为1.499千克,数据库存储值为1.499:如果录入1.499克,存储值为1.显然数据保存有误差,虽然在快递运输中,此误差极小可以忽略不计,但从严谨的角度看,这是不合理的. ...
- J2EE中文乱码处理
在JAVA WEB开发的过程中,经常会遇到中文乱码的情况,中文乱码主要是在浏览器与服务器交互传递数据的时候发生的.对于这个棘手的问题,我参考(韩顺平老师)视频将处理方法总结与此,供自己以及大家开发的时 ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- DHT网络第一部分研究结果 加入长期在线的node
源码:http://jijiea.com/upfile/DHT_Part1_How_To_Join_In_DHT.zip
- C# 类中隐藏基类方法和Partial
今天对于.NET开发人员来说最开心的事情莫过于微软搞开源了,这觉得是给搞.NET开发的长脸.虽然我是一个初学者,这无疑给我极大的学习动力.Fighting!!! 当一个类从父类继承了一个成员时,也就继 ...
- 监控SQL Server的job执行情况
在服务器没有设置发邮件并且不允许发邮件的情况下, 可以通过下列语句来检查SQL Server 的job的执行情况 select top 150 a.run_date,a.run_time, b.nam ...
- SAX EntityResolver 的作用
1.1 何为 EntityResolver : 官方解释: 如果SAX应用程序叙事实现自定义处理外部实体,则必须实现此接口, 并使用setEntityResolver方法向SAX 驱动器注册一个实例. ...
- 30分钟让你了解MongoDB基本操作
今天记录下MongoDB的基本操作,这只是最基本的,所以是应该掌握的. 数据库 数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的文件.一个单一的MongoDB服务器通常有多个数据库. 集 ...
- 图片流滚动效果html代码(复制)
<!doctype html> <html> <head> <meta charset="utf-8" /> < ...
- 团体程序设计天梯赛-练习集L1-016. 查验身份证
L1-016. 查验身份证 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个合法的身份证号码由17位地区.日期编号和顺序编号 ...