javaWeb前后台交互(二)[通俗易懂]

javaWeb前后台交互(二)[通俗易懂]接上一篇javaWeb前后台交互。链接:https://blog.csdn.net/blackplus28/article/details/80603863一、MVC思想责任分离思想.M:Model,数据模型对象.(JavaBean)V:View,视图界面.(JSP,Panel,Window)C:Controller,控制器(Servlet)本次代码采用:Tomc…

大家好,又见面了,我是你们的朋友全栈君。

接上一篇javaWeb前后台交互。链接:https://blog.csdn.net/blackplus28/article/details/80603863

一、MVC思想

责任分离思想.

M:Model,数据模型对象.(JavaBean)

V:View,视图界面.(JSP,Panel,Window)

C:Controller,控制器(Servlet)

javaWeb前后台交互(二)[通俗易懂]

 

本次代码采用:Tomcat7.57  JDK 1.8  Eelipse编写  数据库:Mysql

 

二、项目结构(MVC模式)

自己创建动态项目,然后再建好包。

javaWeb前后台交互(二)[通俗易懂]

1、编写工具类(JdbcUtil)

package util;

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

//  连接数据库
public class JdbcUtil {
	private static Properties p = new Properties();
	static {
		try {
			ClassLoader loader = Thread.currentThread().getContextClassLoader();
			// 从classpath的跟路径去寻找db.properties
			InputStream inStream = loader.getResourceAsStream("db.properties");
			p.load(inStream); // 加载
		} catch (IOException e) {
			throw new RuntimeException("加载classpath路径下的db.properties文件失败", e);
		}
		// 1加载注册驱动
		try {
			Class.forName(p.getProperty("DriverName"));
			System.out.println("加载数据驱动正常");
		} catch (Exception e) {
			throw new RuntimeException("数据库驱动加载失败", e);
		}
	}
	// 返回创建好的Connection对象,用静态的这种方式应该把构造器私有化起来
	public static Connection getConn() {
		try {
			System.out.println("连接数据库正常");
			// 2获取连接对象
			return DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"),
					p.getProperty("password"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		throw new RuntimeException("数据库连接异常");
	}
	// 5):释放资源
	public static void close(Connection conn, Statement st, ResultSet re) {
		try {
			if (re != null) {
				re.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (st != null) {
					st.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 防止先创建对象,然后再调用方法。不让外界创建,直接用类名调用
	private JdbcUtil() {
		}

}

2、domain(model)层

package domain;

/**
 *   用户
 * @author
 *
 */
public class User {
	private int id;
	private String username;
	private String password;
	public User() {
		super();
	}
	
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public User(int id, String username, String password) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
}

 

3、写dao层

 

接口层:

package dao;

import domain.User;

/**
 *  登录
 * @author 
 *
 */
public  interface  IUserDao {
	/**
	 * 用户登录 
	 * @param username
	 * @param password
	 * @return
	 */
	public  User loginUser(String username,String password);
}

实现层:

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import dao.IUserDao;
import domain.User;
import util.JdbcUtil;

public class UserDaoImpl implements IUserDao {
	//  登录
	@Override
	public User loginUser(String username, String password) {
		String sql = "SELECT * FROM t_user WHERE username=? AND password=?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		 try {
			conn = JdbcUtil.getConn();
			ps = conn.prepareStatement(sql);
			ps.setString(1, username);
			ps.setString(2, password);
			rs = ps.executeQuery();
			if (rs.next()) {
				User user = new User();
				user.setUsername(rs.getString("username"));
				user.setPassword(rs.getString("password"));
				return user;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}

4、service接口和实现层

接口:

package service;

import domain.User;

public interface IUserService {
	/**
	 * 登录
	 * @param username
	 * @param password
	 * @return
	 */
	public  User loginUser(String username,String password);
}

实现层:

package service.impl;

import dao.IUserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import service.IUserService;

public class UserServiceImpl implements IUserService{
	private IUserDao dao = new UserDaoImpl();
	@Override
	public User loginUser(String username, String password) {
		
		return dao.loginUser(username, password);
	}
}

5、controller层

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import domain.User;
import service.IUserService;
import service.impl.UserServiceImpl;

public class UserServlet  extends HttpServlet{
	private static final long serialVersionUID = 1L;
	private IUserService userService = new UserServiceImpl();
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String userName = req.getParameter("username");
		String password = req.getParameter("password");
		
		User user = userService.loginUser(userName, password);
		if (user != null) {
			resp.sendRedirect("login_success.jsp");
		}else {
			resp.sendRedirect("login_fail.jsp");
		}
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
}

6、这个时候记得创建resource文件夹,并创建db.properties (你只需把javaweb换成你的数据库名称,两个root分别是数据库账户和密码,自行修改就好)

#key=value

DriverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb
username=root
password=root

 

7、创建三个JSP(view层)

 

我只贴login.jsp代码,登录成功和失败页面里面都是一句话,仅仅为做跳转看效果。

其实完全用把结果存放到session里面,在login.jsp里面写el表达式接受信息也可以看出效果,但因为是初学者,还是多写几个页面看的直观。

javaWeb前后台交互(二)[通俗易懂]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!--登陆框开始-->
	<form action="UserServlet" method="post">
		用户名:<input type="text" class="inputName" name="username"  placeholder="用户名"><br />
		 
		 密  码:<input type="password" name="password" placeholder="密码"><br />
		<button type="submit" >登录</button>
	</form>
</body>
</html>

数据库就不放了,里面就id,username,password三个字段。

效果图:

登录成功:

javaWeb前后台交互(二)[通俗易懂]

登录失败:

javaWeb前后台交互(二)[通俗易懂]

 

三、总结

  写到这里按照MVC模式进行交互已完成。

如果你完全复制我的代码,还报错,这个时候很有可能是环境问题,因为我都是测试了好几遍完全正确才截图的,有问题欢迎留言讨论。

 

如果有不同看法,或者是文中写错的地方,麻烦大佬留言指正文章错误,谢谢!!! 

转载请声明出处:https://blog.csdn.net/BlackPlus28/article/details/80945137

 

——————————————————————————————————————————————————————-

2019-9-19更新:

获取源码:

1、评论,我看到会通过邮件发送源码。但不保证及时性,我也在上班,有时很忙。

 

——————————————————————————————————————————————————————-

2021-2-4

1、由于工作原因,有时候看到评论消息都过去了大半个月甚至一个月。有几个小伙伴私我,建议创建群或者公众号。

   其实之前创建过群,后面陆陆续续加入了400多人,但后来有广告、买课非技术讨论,以及工作忙起来确实没多少精力打理群,于是解散了 。

             javaWeb前后台交互(二)[通俗易懂]之前群,现在解散)。

 

   再次创建一个公众号,方便大家自行下载资料所需源码及可能感兴趣的资料。本文代码下载关键词:javaWeb前后台交互

          javaWeb前后台交互(二)[通俗易懂]

  如有帮助,请给博主一个赞吧。谢谢。

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147265.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 实时系统动态内存算法分析dsa(二)——TLSF代码分析

    实时系统动态内存算法分析dsa(二)——TLSF代码分析上一篇我们看了dsa的分类和简单的内存管理算法实现,这篇文档我们来看TLSF的实现,一种更加高级的内存管理算法;1、实现原理基本的Segregated Fit算法是使用一组链表,每个链表只包含特定长度范围来的空闲块的方式来管理空闲块的,这样链表数组的长度可能会很大。TLSF为了简化查找定位过程,使用了两层链表。第一层,将空闲内存块的大小根据2的幂进行分类,如(16、32、64.

    2022年6月28日
    30
  • 彻底禁止Win10自动更新工具Windows Update Blocker v1.5 汉化版

    彻底禁止Win10自动更新工具Windows Update Blocker v1.5 汉化版以往的Windows10系统我们还可以通过禁止更新服务,设置一些本地组策略来禁止Windows系统的更新,但现在的Windows好像越来越流行更新了,一些简单的禁止完全没用,依旧会自动检查更新!一款你需要的彻底禁止Win10自动更新的工具它来了,WindowsUpdateBlocker是一款免费软件,只需一键,即可帮助您完全禁用或启用Windows系统上的自动更新。使用起来超级…

    2022年6月4日
    132
  • 23岁的一无所有,其实是理所应当的「建议收藏」

    23岁的一无所有,其实是理所应当的「建议收藏」23岁那年你正处在哪个状态?现在呢? 我,23岁,应届毕业生。生活,工作,爱情都处于人生的低谷,一穷二白,一无所有,一事无成。分享一下成长的建议吧。匿名用户23岁那年…就是去年…… 在22岁的时候我毕业,同时第二年准备考研,结果因为压力太大,期望太高,又失利了,但是我依然满怀信心和憧憬 在我23岁那年四月,当我深爱的女孩(在这之前我追了她四年)说她要去北京时,我在毫无准备的情况下,…

    2022年7月25日
    10
  • 深度学习笔记三:反向传播(backpropagation)算法[通俗易懂]

    深度学习笔记三:反向传播(backpropagation)算法[通俗易懂]接上一篇的最后,我们要训练多层网络的时候,最后关键的部分就是求梯度啦。纯数学方法几乎是不可能的,那么反向传播算法就是用来求梯度的,用了一个很巧妙的方法。反向传播算法应该是神经网络最基本最需要弄懂的方法了,要是反向传播方法不懂,后面基本上进行不下去。非常推荐的是Howthebackpropagationalgorithmworks在最开始的博客中提过,这本书是这篇笔记用到的教材之

    2022年5月5日
    67
  • 分布式存储系统考虑因素-分区容错性[通俗易懂]

    分布式存储系统考虑因素-分区容错性[通俗易懂]分布式存储系统中的多台服务器通过网络进行连接。但是我们无法保证网络是一直通畅的,分布式系统需要具有一定的容错性来处理网络故障带来的问题。

    2022年7月25日
    5
  • ipynb可以用pycharm_pycharm运行jupyter

    ipynb可以用pycharm_pycharm运行jupyter背景我的Pycharm下面有很多Project,每个Project一个Anaconda环境,昨天新开了一个Project叫CLRS_Code,Anaconda环境名也叫CLRS_Code然后我之前没有在Pycharm里面用过Jupyter,突然想试试这个功能,然后就新建一个.ipynb文件,Pycharm提示我没有装JupyterPackages,然后我就在Pycharm里面装了,装完之后,搜索…

    2022年8月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号