基于IDEA的bs三层架构
1.在大学的老师讲课中,可能会用到myeclipse或者eclipse来进行编译运行。其中的缺点就是要自行去下载开发所需要的一些jar包,要考虑都版本的不同造成的影响,且ORACLE和MYSQL的链接容易出错。而目前为止企业开发基于IDEA编译器开发,maven进行自动导包减去了大量麻烦的操作;(Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对于学了一点maven的人来说,就有些熟悉了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。)
所以,根据上一段的描述,我们最终的目的就是学会如何在pom.xml中配置获取到我们想要的jar包,在此之前我们就必须了解如何创建maven项目,maven项目的结构是怎样,与普通java,web项目的区别在哪里,还有如何配置pom.xml获取到对应的jar包等等,这里提前了解一下我们如何通过pom.xml文件获取到想要的jar的,具体可以看一下这个视频链接https://www.bilibili.com/video/av29071483?p=1 只看第一集基本上就可以解决自己的困惑。
tomcat 服务器(用于解析jsp)
3.下面是代码的截图与解析(在这步之前先做到根据2的视频链接下载apache-maven-3.6.1或者最新版本并保存好路径配置好apache-maven-3.6.1/conf/settings.xml信息(它是用来设置maven参数的配置文件。并且,settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。
Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。)
maven网上https://mvnrepository.com/上复制粘贴使用量高的两个配置到pom.xml里面
具体代码如下
package com.stu.pojo;
/*实体类alt+enter实现get/set方法,toString方法,有参无参构造函数
https://blog.csdn.net/peng86788/article/details/80567548*/
public class User {
private int id;
private String username;
private String password; @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
} public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
} public User() {
} 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;
}
}
jdbc访问数据库的接口(目的就是连接mysql成功)
package com.stu.jdbc; import com.stu.pojo.User; import java.sql.*;
import java.util.ArrayList;
import java.util.List; public class Demo { public static void main(String[] args)throws Exception { //1.动态加载驱动
Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象
String url = "jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String pwd = "123456";
//DriverManager管理一组 JDBC 驱动程序的基本服务,getConnection试图建立到给定数据库 URL 的连接
Connection conn = DriverManager.getConnection(url,user,pwd); //3.使用JDBC接口规范实现CRUD
String sql = "insert into user(username,password) values(?,?)";
// String sql = "select * from user"; /*表示预编译的 SQL 语句的对象。 SQL 语句被预编译并存储在 PreparedStatement 对象中。
然后可以使用此对象多次高效地执行该语句。*/
PreparedStatement ps = conn.prepareStatement(sql);
// ps.setString(1,"tom");
// ps.setString(2,"123456");
ps.setObject(1,"韩梅梅");
ps.setObject(2,"lilei123");
//将此连接的自动提交模式设置为给定状态。jdbc中默认自动提交,
// commit或rollback不起作用,一般setAutoCommit改成false,commit或rollback才起作用进行事务处理。
conn.setAutoCommit(false);
int rel = ps.executeUpdate();
System.out.println(rel);
conn.commit(); // ResultSet rs = ps.executeQuery();
// List<User> list = new ArrayList<User>();
// while(rs.next()){
//
// int id = rs.getInt(1);
// String username = rs.getString(2);
// String password = rs.getString(3);
//
// User u = new User(id,username,password);
// list.add(u);
// }
//
//
// System.out.println(list);
} }
Servlet是在服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是服务器) 负责执行Java程序,
(servlet的方法中使用JDBC连接数据库)
package com.stu.servlet; import com.stu.pojo.User;
import com.stu.service.UserService; 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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException; /*@WebServlet用注解来实现servlet和url的映射jsp页面 通过action提交到此处:
<form action="/login" method="post" >*/ @WebServlet("/login")
public class LoginServlet 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8"); //接收请求参数
String username = req.getParameter("username");
String password = req.getParameter("password"); User user = new User();
user.setUsername(username);
user.setPassword(password); //查询数据
UserService us = new UserService();
User u = null;
try {
u = us.login(user);
} catch (SQLException e) {
e.printStackTrace();
} //跳转
if(u==null){
req.setAttribute("mess","账号或密码错误");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}else{
HttpSession session = req.getSession();
session.setAttribute("user",u);
resp.sendRedirect("main.jsp");
}
}
}
index.jsp动态页面显示网络端口连接成功
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
login.jsp显示登入成功
<%--
Created by IntelliJ IDEA.
User: 123
Date: 2019/4/22
Time: 0:42
To change this template use File | Settings | File Templates.
--%>
<!--设置编写语言为java,编写内容为txt或者html设置编码格式为UTF-8-->
<%--在page directive中的isELIgnored属性用来指定是否忽略。格式为: <%@ page isELIgnored="true|false"%>--%>
<%--如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式${2000 % 20}, 在isELIgnored="true"--%>
<%--时输出为${2000 % 20},而isELIgnored="false"时输出为100。Web容器默认isELIgnored="false"。--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html>
<head>
<title>登入</title>
</head>
<body>
<h1>用户登入</h1>
<hr>
<form action="/login" method="post"/>
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
<input type="submit" value="登入">
</p>
</form>
${mess}<!--获取后端传输过来的数据-->
</body>
</html>
截止到以上内容jdbc+jsp+servlet的一个例子已经完成(JSP就是视图,其本质就是一个servlet,先有servlet后出现的jsp),这些内容表示的是控制器的运行原理
重点
B/S结构下,用户工作界面是通过浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器(Server)实现,形成所谓三层结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。
mvc三层架构(model模型对应service和dao控制访问和修改这些数据的业务规则,view视图对应于jsp,它从模型那里获得数据并指定这些数据如何表现。当模型变化时,视负责维持数据表现的一致性。视同时将用户要求告知控制器(Controller)。控制器(Controller)定义了应用程序的行为;它负责对来自视的用户要求进行解释,并把这些要求映射成相应的行为,这些行为由模型负责实现。)注意,MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动!
下面是继续增加的代码,数据库处理的dao层,业务逻辑service
package com.stu.dao; import com.stu.jdbc.JDBCUtils;
import com.stu.pojo.User; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; public class UserDao {
/*JDBCUtils是对jdbc连接数据库做了一个封装,而getConnection这个方法就可以
实现对数据库的连接*/
private Connection conn = JDBCUtils.getConnection(); /*和 Statement一样,PreparedStatement也是用来执行sql语句的
与创建Statement不同的是,需要根据sql语句创建PreparedStatement*/
private PreparedStatement ps; /**
* 添加用户
* @param user 要添加的用户对象
* @throws SQLException
*/
public int add(User user) throws SQLException {//自动抛出异常
String sql = "insert into user(username,password) values(?,?)"; //来将参数化的 SQL 语句发送到数据库
ps = conn.prepareStatement(sql); //使用给定对象设置指定参数的值。
ps.setObject(1,user.getUsername());
ps.setObject(2,user.getPassword()); /*在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言
(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;
或者是无返回内容的 SQL 语句,比如 DDL(数据库模式定义语言)语句。返回对象为int类型*/
return ps.executeUpdate();
} /**
* 删除
* @param id
* @return
* @throws SQLException
*/
public int delete(int id) throws SQLException {
String sql = "delete from user where id=?";
ps = conn.prepareStatement(sql);
ps.setObject(1,id);
return ps.executeUpdate();
} /**
* 修改
* @param user
* @return
* @throws SQLException
*/
public int update(User user) throws SQLException {
String sql = "update user set username=? and password=? where id=?";
ps = conn.prepareStatement(sql);
ps.setObject(1,user.getUsername());
ps.setObject(2,user.getPassword());
ps.setObject(3,user.getId());
return ps.executeUpdate();
} /**
* 查询所有
* @return
* @throws SQLException
*/
public List<User> findAll() throws SQLException {
String sql = "select * from user";
ps = conn.prepareStatement(sql); /*表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。
next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,
所以可以在 while 循环中使用它来迭代结果集。默认的 ResultSet 对象不可更新,
仅有一个向前移动的光标。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。*/
/*要用statement类的executeQuery()方法来下达select指令以查询数据库,
executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用*/
ResultSet rs = ps.executeQuery();
/*代码尽量依赖于抽象,不依赖于具体”。形式就是依赖具体,这种形式就是依赖于抽象。
因为List是接口。代码依赖于抽象的好处是,代码可以方便替换。*/
List<User> list = new ArrayList<User>();
while(rs.next()){
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
User u = new User(id,username,password);
list.add(u);//集合列表中添加对象
}
return list;
} /**
* 根据ID查询
* @param id
* @return
* @throws SQLException
*/
public User findByID(int id) throws SQLException {
String sql = "select * from user where id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1,id); ResultSet rs = ps.executeQuery();
User u = null;
while(rs.next()){
int uid = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
u = new User(uid,username,password);
}
return u;
} /**
* 登录的方法
*/
public User login(User user) throws SQLException {
String sql = "select * from user where username=? and password=?";
ps = conn.prepareStatement(sql);
ps.setObject(1,user.getUsername());
ps.setObject(2,user.getPassword());
ResultSet rs = ps.executeQuery();
User u = null;
while(rs.next()){
int uid = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
u = new User(uid,username,password);
}
return u;
} }
package com.stu.service; import com.stu.dao.UserDao;
import com.stu.pojo.User; import java.sql.SQLException;
import java.util.List; public class UserService { private UserDao userDao = new UserDao(); /**
* 添加用户
* @param user 要添加的用户对象
* @throws SQLException
*/
public int add(User user) throws SQLException {
return userDao.add(user);
} /**
* 删除
* @param id
* @return
* @throws SQLException
*/
public int delete(int id) throws SQLException {
return userDao.delete(id);
} /**
* 修改
* @param user
* @return
* @throws SQLException
*/
public int update(User user) throws SQLException {
return userDao.update(user);
} /**
* 查询所有
* @return
* @throws SQLException
*/
public List<User> findAll() throws SQLException {
return userDao.findAll();
} /**
* 根据ID查询
* @param id
* @return
* @throws SQLException
*/
public User findByID(int id) throws SQLException {
return userDao.findByID(id);
} /**
* 登录
*/
public User login(User user) throws SQLException {
return userDao.login(user);
} }
补充的代码为
package com.stu.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class JDBCUtils { public static Connection connection;
private static String url = "jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=UTF-8";
private static String user = "root";
private static String pwd = "123456"; static{
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url,user,pwd);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
} public static Connection getConnection(){
return connection;
} }
控制层servlet应用程序对其注册的代码
package com.stu.servlet; import com.stu.pojo.User;
import com.stu.service.UserService; 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.sql.SQLException; @WebServlet("/reg")
public class RegUserServlet 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8"); //接收请求参数
String username = req.getParameter("username");
String password = req.getParameter("password"); User user = new User();
user.setUsername(username);
user.setPassword(password); //存储数据
UserService us = new UserService();
int i = 0;
try {
i = us.add(user);
} catch (SQLException e) {
e.printStackTrace();
}
//跳转
if(i>0){
req.setAttribute("mess","注册成功");
req.getRequestDispatcher("reg.jsp").forward(req,resp);
}else{
req.setAttribute("mess","注册失败");
req.getRequestDispatcher("reg.jsp").forward(req,resp);
} }
}
对应与reg.jsp
<%--
Created by IntelliJ IDEA.
User: 123
Date: 2019/4/22
Time: 0:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<hr>
<form action="/reg" method="post"/>
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
${mess}
</body>
</html>
main.jsp用于登入成功后实现跳转后出现的消息
<%--
Created by IntelliJ IDEA.
User: 123
Date: 2019/4/22
Time: 0:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>欢迎使用本系统</h1>
当前用户:${sessionScope.user.username}
</body>
</html>
基于IDEA的bs三层架构的更多相关文章
- 部署基于国际版Azure的SharePoint三层架构服务器场
前言 微软Azure国际版已经很普及了,这里没有用国内版(世纪互联),用的是国际版,当然是由于公司性质的缘故.这里一步步图文的方式,分享给大家创建Azure国际版的SharePoint三层架构的过程, ...
- 基于EF+WCF的通用三层架构及解析
分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...
- 基于三层架构项目下的Ado【六】
一.基于三层架构项目下的Ado增删改查总结,提示:现在一般都是使用EF框架操作. 1. 先在model层创建出一个和你将会查询出一样类型的表,比如你将查询出的有五个字段,那么你就需要创建出一个和你查询 ...
- 分享基于EF+WCF的通用三层架构及解析
本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- 有了门面,程序会更加体面!- pos软件基于三层架构 -09
续上篇) 大鸟说道:“实际上没有学过设计模式去理解三层架构会有失偏颇的,毕竟分层是更高一级别的模式,所谓的架构模式.不过在程序中,有意识的遵循设计原则,却也可以有效的做出好的设计.” ...
- asp.net -mvc框架复习(10)-基于三层架构与MVC搭建项目框架
一.三种模式比较 1.MVC框架(适合大型项目) (1).V视图 (网页部分) (2).M模型 (业务逻辑+数据访问+实体类) (3).C控制器 (介于M和V之间,起到引导作用) 2.三层架构 (1) ...
- 基于三层架构下的公共数据访问方法(Sqlite数据库)
作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法.参数方法.存储过程方法. 那么什么是三层架构呢? UI---存放Form窗体---(用户所关心的) ...
- 三层架构和MVC
注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html 又看到有人在问三 ...
随机推荐
- 06-jQuery的文档操作
之前js中咱们学习了js的DOM操作,也就是所谓的增删改查DOM操作.通过js的DOM的操作,大家也能发现,大量的繁琐代码实现我们想要的效果.那么jQuery的文档操作的API提供了便利的方法供我们操 ...
- The First BoKe
A.如何看待师生关系 说起师生关系,我们每个人都有不同的见解,但无一例外,师者,传道授业解惑也,老师的为学生传授的才能知识,是学生今后发展的宝贵财富,无论是从哪方面,都可以对学生起着积极向上的作用.而 ...
- 使用gulp+bebal实现前端自动化es6转es5的构建
说明:es6语法已经越来越普及,但是一些低版本的浏览器不支持es6的语法特性,所以我们在开发完前端项目后,往往需要统一把前端es6的代码编译成es5的代码.本文介绍的就是如何手动和自动的把es6转成e ...
- ReactNative学习笔记(一)环境搭建
前言 本文开发环境为Windows,目标平台为Android,react-native版本为0.35.0. 环境搭建 注意,本文不是按照官网的教程来的,官网说必须安装什么Chocolatey,我懒得鸟 ...
- Android Service用法知识点的讲解
Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...
- ELK实战(Springboot日志输出查找)
需求 把分布式系统,集群日志集中处理快速查询 搭建ELK并与springboot日志输出结合 搭建ELK 基于我前面的elasticsearch搭建博客文档docker-compose.yml基础上进 ...
- 移动端h5页面的那些坑
最近一直在写移动端页面,由于之前写移动端写的比较少,所以此次踩过许多坑.特此总结一下: 1.<input type='button'>背景色在ios中的兼容性,颜色发白 解决办法:在全局样 ...
- [Objective-C语言教程]快速枚举(35)
快速枚举是Objective-C的功能,用于枚举集合. 因此,要了解快速枚举,首先需要了解集合,这将在下一节中进行说明. 1. Objective-C集合 集合是基本结构.它用于保存和管理其他对象. ...
- JavaEmail-邮箱
package service; import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.Message;import java ...
- 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 3.Programming assignments:Face Recognition for the Happy House
Face Recognition for the Happy House Welcome to the first assignment of week 4! Here you will build ...