当前位置:网站首页>数据源,分层开发以及jsp标签总结及相关代码
数据源,分层开发以及jsp标签总结及相关代码
2022-08-02 14:18:00 【Wsy286047981】
数据源
使用jdbc访问数据库的缺点:
每次操作都要先取得连接然后释放资源,频繁的连接释放稳定性差,有安全隐患
所以可以使用tomcat连接池弥补jdbc的缺点
连接池是由容器提供(Tomacat就是一个容器)的
tomcat先在连接池中创建若干连接
用户需要时连接池给用户分配空闲连接,之后闲置了再自动回收
连接池里的连接对象是由数据源创造的
在程序中使用JNDI获取数据源
先对tomcat进行配置
在tomcat的conf下的context.xml文件中进行配置
auth为连接方式;driverClassName为JDBC驱动;url为数据库的URL地址;maxActive为最大活动连接数;maxIdle为最大空闲连接数 maxWait为最大等待时间
maxIdle为最大空闲连接数;maxWait为最大等待时间(毫秒数);type为数据源的类型;
那个resource name是之后要通过这个名称获取数据源,名字可以自己随便取
数据源的类是DateSource
因为这种连接方式是用的连接池,连接池是由容器(Tomcat)管理的
所以用这种方法连接就需要开启tomcat服务器,所以不能再main方法里面运行,不能用main来启动,只能用tomcat来启动
下面这段代码是通过jndi获取数据源
Context ctx= new InitialContext ();
DataSource ds=(DataSource)ctx.lookup ( name:"java:comp/env/jdbc/news" );
connection= ds.getConnection();
连接了以后就和jdbc一样正常使用了
JavaBean和pojo
javaBean说白了就是java类,pojo也是
但是和之前不一样的是,pojo只进行数据的封装,不处理业务逻辑,也可以叫做简答java对象
一般数据库里由几个表就会对应几个pojo类
然后这个表有几个列,就对应类里面的几个属性,然后每个属性使用private封装然后协商getset
dao
dao也称数据库访问接口层,主要负责数据库增删改查的等操作的事情
dao:数据库接口
daoImpl:数据库接口的实现类
之前有写过用dao来实现增删改查的代码和过程
https://blog.csdn.net/qq_53190228/article/details/125755378?spm=1001.2014.3001.5501
Service
实现业务逻辑的类,也可以理解成,实现应用的用例的集合,和dao一样,也需要写接口然后写接口的实现类,最好建成两个包,一个包放接口,一个包放实现类
分层开发
一般一个web项目分为
页面
↓
Service
↓
dao
↓
数据库
这么几层,层与层之间不能跨越,比如说,页面里用户向实现某一个功能的时候就不能直接调用dao的方法,而是应该先进入Service,再再Service里调用dao的方法,然后dao再对数据库进行增删改查
层与层之间传递的应当是java类,而不是零散的数据
使用分层对数据库进行查询并且在网页输出
<%@ page import="newsDao.NewsDaoImpl" %>
<%@ page import="newsDao.NewsDao" %>
<%@ page import="newsDao.BaseDao" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.Timestamp" %>
<%@ page import="serverce.NewsServerce" %>
<%@ page import="serverceImpl.NewsServerceImpl" %>
<%@ page import="java.util.List" %>
<%@ page import="pojo.News" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="common/common.jsp"%>
<html>
<head>
<title>Title</title>
</head>
<style>
html,body{
height:100%;
}
body{
margin-left: 10%;
}
#news {
position: absolute;
left:28%;
top: 31%;
width: 54%;
list-style: none;
height: 25%;
}
#news ul li:nth-child(1){
width: 30%;
}
#news ul li:nth-child(2){
width: 30%;
}
#news ul li:nth-child(3){
width: 23%;
}
#news ul li:nth-child(4){
width: 15%;
}
#news ul li{
margin-top: 0%;
height: 93%;
line-height: 273%;
float: left;
border: 2px solid gray;
list-style: none;
}
#news ul{
margin: 0px;
height: 50px;
padding: 0px;
}
.grayBack{
background-color: gray;
}
</style>
<body>
<%--<div id="shang">--%>
<%-- 上--%>
<%--</div>--%>
<jsp:include page="shang.jsp"></jsp:include>
<jsp:include page="zuo.jsp"></jsp:include>
<div id="news">
<ul class="xia">
<li>新闻标题</li>
<li>作者</li>
<li>发布日期</li>
<li>
<button type="button" onclick="addNews();" >加新闻</button>
</li>
</ul>
<%
List<News>list=newsServerce.getNewsList();
int i=0;
for (News news:list) {
i++;
%>
<ul <% if (i%2==0) {
%>class="grayBack"<%}%>>
<li><%=news.getTitle()%></li>
<li><%=news.getAuthor()%></li>
<li><%=news.getCreateDate()%> </li>
<li>
删除
</li>
</ul>
<%}%>
</div>
<jsp:include page="xia.jsp"></jsp:include>
</body>
<script>
function addNews() {
window.location="addNews.jsp";
}
</script>
</html>
这是展现所有数据的jsp文件
它new的对象写进了<%@include file=“common/common.jsp”%>这个是一个静态包含,
有点类似c语言的include头文件,也是要写在头部,减少之后重复复制代码的麻烦
等会总结动静态包含,现在先说分层
反正就是这个头文件创建了一个NewsServerceImpl对象叫做newsServerce,它属于Service层,Service层里写逻辑业务,所以就要把相关方法写进Service,包括这个查看所有新闻,该方法返回了一个List集合里面是数据库所有的新闻对象,新闻的信息也都被打包进了这个对象里,也就是pojo
```java
package serverce;
import pojo.News;
import java.util.List;
//对新闻信息做业务逻辑操作的接口
public interface NewsServerce {
//查询全部新闻
public List<News> getNewsList();
public boolean addNews(News news);
}
上面这是接口代码
package serverceImpl;
import newsDao.NewsDao;
import newsDao.NewsDaoImpl;
import pojo.News;
import serverce.NewsServerce;
import java.util.List;
public class NewsServerceImpl implements NewsServerce {
private NewsDao newsDao;
@Override
public List<News> getNewsList() {
return newsDao.getNesList();
}
@Override
public boolean addNews(News news) {
return newsDao.addNews(news);
}
public NewsServerceImpl(){
newsDao=new NewsDaoImpl();
}
}
上面这是实现类的办法,可以看到,这里的service的实现类,又继续向下调用了Dao的办法,进入了下一层,Dao层
dao层的方法就和我前面写的连接里的一样了,但因为我修改了一点点,这里就再贴一次吧
public List<News> getNesList() {
List<News> list=new ArrayList<>();
try {
String sql = "select id,categoryid,title,summary,createdate,author from kgcnews.news_detail";
Object[] pramas = {
};
ResultSet result=this.executeSQL2(sql,pramas);
while (result.next()) {
// int id=result.getInt(1);
//也可以写列名
int id = result.getInt("id");
// String title=result.getString(2);
String newsTitle = result.getString("title");
int categoryid = result.getInt("categoryid");
String summary = result.getString("summary");
String author=result.getString("author");
Timestamp createdate = result.getTimestamp("createdate");
News news=new News();
news.setId(id);
news.setAuthor(author);
news.setTitle(newsTitle);
news.setSummary(summary);
news.setCreateDate(createdate);
news.setCategoryId(categoryid);
list.add(news);
// System.out.println(id + "\t" + newsTitle + "\t" + categoryid + "\t" + summary + "\t" + author+"\t"+createdate);
}
}catch (Exception e){
}
return list;
}
这是查看所有数据库信息的方法,这里调用了executeSQL2方法
executeSQL2方法的代码
public ResultSet executeSQL2(String sql,Object[] paramas) {
if (this.getConnection2()) {
try {
pstmt = connection.prepareStatement(sql);
for (int i = 0; i < paramas.length; i++) {
pstmt.setObject(i + 1, paramas[i]);
}
result = pstmt.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return result;
}
executeSQL2方法里又使用了getConnection2的方法,该方法内就使用了前面提到的,jndi使用连接池连接的方法,这是getConnection2的方法
若是在连接时报错
server time zone value ‘???��������??��??’ is unrecogni
就是数据库的原因,时区的问题,可以在连接mysql的url后添加?serverTimezone=UTC
(前面没有空格),或者在cmd里打开mysql然后给自己的时区加上八小时就ok了
public boolean getConnection2(){
//先初始化一个上下文对象
try {
Context ctx=new InitialContext ();
DataSource ds=(DataSource) ctx. lookup ("java:comp/env/jdbc/news");
connection=ds.getConnection();
//通过数据源拿到链接
// connection=ds.getConnection();
} catch (NamingException | SQLException e) {
e.printStackTrace();
}
return true;
}
最后一层一层相关联就把数据库的数据传到我们自己布置的页面上了
在页面对数据库数据进行添加
页面里按下删除按钮之后调用javascript方法
进入addNews.jsp页面
提交后进入doAdd.jsp处理提交信息
<%@ page import="pojo.News" %><%--
Created by IntelliJ IDEA. User: 王诗韵
Date: 2022-07-15
Time: 2:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="common/common.jsp"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
News news=new News();
int categoryId=Integer.parseInt(request.getParameter("category"));
String title=request.getParameter("title");
String summary=request.getParameter("summary");
String content=request.getParameter("content");
String Author=request.getParameter("Ahtor");
news.setCategoryId(categoryId);
news.setSummary(summary);
news.setTitle(title);
news.setContent(content);
news.setAuthor(Author);
boolean flag=newsServerce.addNews(news);
if (flag==true){
%>
<jsp:forward page="testDataSource.jsp"></jsp:forward>
<%}else {
%>
<jsp:forward page="addNews.jsp"></jsp:forward>
<%
}
%>
</body>
</html>
和之前写过的获得表单信息用的是同一种方法,因为没有使用重定向转页面,request有效,这里就用request来接受表单数据了,之前的帖子中有完整源码
https://blog.csdn.net/qq_53190228/article/details/125755539?spm=1001.2014.3001.5501
这是上面那个jsp文件中调用的那个Service方法对应的dao的实现类里对应这个问题的方法的代码
public boolean addNews(News n){
boolean flag=false;
String sql="insert into kgcnews.news_detail(categoryid,title,summary,content,author) values(?,?,?,?,?)";
Object[] params={
n.getCategoryId(),n.getTitle(),n.getSummary(),n.getContent(),n.getAuthor()};
int i=this.executeUpdate(sql,params);
if (i>0){
System.out.println("插入成功");
flag=true;
}
this.closeResource();
return flag;
}
返回值是布尔类型,若是true就返回之前的那个展现所有数据的页面,如果填写失败就继续留在增加数据的这个页面
这次的跳转没有用javascript也没有用转发或者重定向,而是使用了jsp标签
jsp标签
jsp:useBean标签
就是把创建对象当网页标签写,可以让代码写的更少一些,可以写在静态引用include的里面再引用静态include
id里写取的对象名,class里写类所在的包名前缀+类名,写在网页代码头部
<jsp:useBean id="newsServerce" class="serverceImpl.NewsServerceImpl"></jsp:useBean>
jsp:include标签(动态)
可以让一个页面包含多个页面,直接引用就行,不会压缩比例,都是重叠存在的
语法:
他是动态引用,是先处理再返回,所以返回的是一个结果集
<jsp:include page="jsp文件名"></jsp:include>
<%@include file=“”%>(静态)
静态引用,先返回再处理,所以可以拿来存那个javaBean,一样写在头部,如果引用javaBean没有用静态的引用而是动态的,那它编译器不报错但是网页会报500错误,因为动态的会把它处理成结果集
边栏推荐
- 小知识点系列:StringUtil.isEmpty()与StringUtil.isBlank()的区别
- LAMP环境 源码编译安装(Apache 2.4.52 +mysql 8.0.28+php 8.1.3)
- hybrid 实现同网段但不同vlan之间通讯
- 解决启动filebeat时遇到Exiting: error unpacking config data: more than one namespace configured accessing错误
- Object.defineProperty方法(详解)
- WEB自动化之多窗口操作、切换frame、弹窗处理
- 这几年让你大呼惊人的AI应用,都离不开这项技术
- 时频分析之Wigner-Ville分布
- 【软件测试】selenium自动化测试1
- VLAN原理
猜你喜欢
随机推荐
【交换机端口安全技术 】
小知识点系列:StringUtil.isEmpty()与StringUtil.isBlank()的区别
二、QT界面开发--新建C语言工程
nvm详细安装步骤以及使用(window10系统)
JMM&synchronized&volatile详解
makefile——杂项
VMware 安装openwrt
小知识系列:Fork之后如何与原仓库分支同步
RTMP, RTSP, SRT 推流和拉流那些事
nodejs 的下载安装与环境配置
makefile——library
Homebrew的简单介绍
2021年度总结——收获圆满的一年
Mysql理解MVCC与BufferPool缓存机制
(三)文件操作之一——文件IO
Mobile copy constructor
基于Visual Studio 2015的CUDA编程(一):基本配置
软件测试之WEB自动化
【软件测试】概念篇
【软件测试】进阶篇