S1_servlet与数据库连接、filter过滤器、分页 实操的叙述

知识点的叙述:

Servlet的初始

servlet中的doGet和doPost方法:所有请求默认get(速度快,不安全)

三个页面login.jsp、dologin.jsp、index.jsp

在login.jsp中是form表单制作的登录界面

在dologin.jsp中是进行了获取数据和结果处理(是否登录成功、页面的跳转)

在index.jsp中-------登录成功进入首页(xxx欢迎!)

Servlet的作用:就是将接收参数、调用业务、返回结果操作java代码不在jsp中使用,直接写在java类中。因此拥有了servlet包中的servlet类,它继承HttpServlet,当中有很多方法。(右键Servlet文件)

此时只需将dologin中java代码放入selvlet中,通过注解连接form表单

<form action="LoginServlet" method="get">

注解的地方:

@WebServlet(“/名字”):/名字====com.wxy.servlet.LoginServlet


servlet与数据库的连接使用

与数据库的数据相连接:就需要Dao层与数据库连接,用数据库的用户与之相连接

建立Dao包中的接口和实现类:接口中写登录方法,实现中写jdbc(已经用工具类封装了数据库连接的方法getConnection()和executeSQL()等方法直接调用。new对象放数据)


service

在这里插入图片描述

因为有了业务类,Service要调dao层,在servlet就不可以直接调用dao层 UserDao userDao = new UserDaoImpl(); 就需要放在service的实现类中。

在servlet中要调service层,UserService userService = new UserServiceImpl();

过程——jsp发起请求通过注解调用Servlet——servlet去调service——service在去调dao——dao再去连接数据库。

return找到数据在原理返回显示在jsp


当登录成功首页需要显示provider信息。此时loginServlet页面跳转就不能直接去index(首页),而是进入ProviderServlet,一个Servlet干一件事。

并且注意在loginServlet到ProviderServlet的跳转时,要重定向而不是转发,

转发路径的地址仍是loginServlet。


Filter过滤器

编码过滤器:
//转码 post请求解决乱码问题
request.setCharacterEncoding("utf-8");

每个页面为了防止乱码问题,需要此语句,但是每次使用都要单独在写,繁琐重复,所以使用过滤器运行此代码后放行再继续运行其他代码。

在Filter中,注解@WebFilter(“/*”) 是过滤路径不是实际的路径:

	完全匹配:/index.jsp  匹配到这个文件
    目录匹配:/admin/*	 匹配到admin文件下的所有文件
    扩展名匹配:*.do		以do为结尾的文件
    全部匹配:/*			 全部

在doFilter中访问请求:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //转码 post请求解决乱码问题
    request.setCharacterEncoding("utf-8");
    chain.doFilter(request, response);//放行
    //System.out.println("执行完成doFilter");
}
登录过滤器:

在登录login.jsp中传递user对象到首页index.jsp,在这里用session保存user对象,登录了才可以访问login.jsp之后的类(有数据)和页面,但是此时服务器重新启动,直接访问ProviderServle,但是并没有登录,session中的user为空,会报错500。我们使用过滤器让他不报错,直接返回登录页面重新登陆

拦截器判断是否登录:

除了登录页面之外都揽,/web/ProviderServlet加前缀

  • HttpServletRequest作为ServletRequest的子类要强转
  • req.getSession().getAttribute(“user11”)拿值,不用遍历
  • 登录失败重定向
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest)request;//HttpServletRequest作为ServletRequest的子类要强转
    HttpServletResponse res = (HttpServletResponse)response;
    //req.getSession().getAttribute("user11")拿值,不用遍历
    if(req.getSession().getAttribute("user11")!=null) {  
        chain.doFilter(request, response);		
    }else { //登录失败重定向
        res.sendRedirect(req.getContextPath()+"/login.jsp"); //绝对路径
    }
}

分页分析

上、下一页:

重要参数:

每页显示条数pageSize-----自定义已知

当前第几页:currentPage

偏移量pyl:(当前页数-1)×每页显示条数

总共数据条数totalCount:【select count(1) from 表名】获得

总共页数:sumPage = 总条数/每页显示条数

  • 整除:sumPage = 总条数/每页显示条数
  • 非整除:sumPage =( 总条数/每页显示条数)+1
  • 所以:总页数 = 总条数%每页显示条数==0?(总条数/每页显示条数):(总条数/每页显示条数)+1

过程叙述:

1、在service接口中传递参数:当前页currentPage和页面容量pageSize

2、在service的实现中计算好偏移量,方便dao层的实现用偏移量(因为limit()的两个参数是偏移量和每页显示的条数)

3、dao层总查询中传递参数:偏移量pyl和pageSize

4、dao实现中:

List<Provider> listpro = proService.findAllProvider(5,currentPage);	

5、此时currentPage需要通过传递过来进行上下页的跳转。因为当前的servlet(ProviderServlet.java)是从login重定向过来的不能传参数,且没有参数可传,所以首次进入servlet中currentPage为空,所以我们要登录进入后就显示第一页数据,就添加定义参数—int currentPage = 1,加判断。

注意:传参的时候,字符类型转为数字类型 parseInt() 方法。

int currentPage = 1;
if(request.getParameter("currentPage")!=null) {
			currentPage = Integer.parseInt(request.getParameter("currentPage"));
		}

6、接下来就在首页编写前端的动态的上一页下一页,并且控制上一页到第一页不能在上一页,下一页到最后一页也不能在继续。注意标签套进去的作用

首页、上一页:

<!-- 页数小于1不能在上一页 -->
	<a href="ProviderServlet?currentPage=1">首页</a>
	<a 
	<c:if test="${currentPage>1 }"> 
  	href="ProviderServlet?currentPage=${currentPage-1 }"
  	</c:if>
  	>上一页</a>

7、最后一页跳转的时候,判断当前页<总页数 会用到总页数=总条数/页面容量

所以要有一个新的查询,获得总条数,从dao层正向开始。下面只展现了daoImpl的sql代码:

//dao 实现层
//获得总记录数
@Override
public int findStudentCount() {
    int totalCount = 0;
    try {
        if(getConnection()) {
            String sql = "select count(1) as totalCount from smbms_user";
            ResultSet rs = executeSQL(sql,null);			
            while(rs.next()) {
                totalCount = rs.getInt("totalCount");
            }
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return totalCount;
}

获得总条数是为了计算总页数,在service实现返回的应该有总页数sumPage,计算的时候需要pageSize参数,service的接口中传参。下面只展现serviceImpl的代码:

也可以在此处不计算,根据自己在前端页面是否需要totalCount总条数等参数,若需要则将计算写在servlet中并获取,在jsp页面${}获取。

@Override
public int findStudentCount(int pageSize) {
    //总条数
    int totalCount = proDao.findStudentCount();
    //总页数====(总记录数%5==0?(总记录数/5):(总记录数/5+1))
    int sumPage = (totalCount%5==0?(totalCount/5):(totalCount/5+1));
    return sumPage;
}

在Servlet中获得总页数,并传数据,在首页中实现下一页和尾页的前端

下一页、尾页

//获得总页数:
int sumPage = proService.findStudentCount(5);
request.setAttribute("sumPage", sumPage);  //总页数
//index.jsp
<!-- 页数大于总页数后不能在下一页,下一页不在显示禁用 -->
<a 
<c:if test="${currentPage<sumPage }"> 
href="ProviderServlet?currentPage=${currentPage+1 }"
</c:if>
>下一页</a>
<a href="ProviderServlet?currentPage=${sumPage}">尾页</a>

还有一种是go__,明确跳转到第几页,注意设置跳转页数大于总页数定格到最后一页就好了。

//currentPage当前页;sumPage:总页数
if(currentPage<sumPage) {
	currentPage = sumPage
}		

根据输入的页面容量分页:

输入想让这一页显示多少条数据的不同选择。前端jsp页面使用下拉框来实现。使用js实现:

<strong>每页显示</strong>
<select id="size" οnchange="pageCount(this)">
	<option value="5">5</option>
	<option value="10">10</option>
	<option value="15">15</option>
</select>
<strong>条</strong>

<script type="text/javascript">
	document.getElementById("size").value = ${pageSize};  //下拉框中默认值=选中的pageSize
	function pageCount(a){
		location.href = "/webServlet/web/ProviderServlet?currentPage=1&pageSize="+a.value;
	}

</script>

在servlet中获取页面容量:判断,刚进入的时候默每页5条数据,点击下拉框条数根据选择而变

//页面容量:
int pageSize = request.getParameter("pageSize")==null?
    5:Integer.parseInt(request.getParameter("pageSize"));

注意:此时根据选择分页已经完成,但是当你点击下一页的时候,又变成了默认的5条,就需要将pageSize在每个路径后面都加上此参数,即首页、上下一页、尾页跳转跟参数pageSize,辨识分页。

//示例:
<a href="ProviderServlet?currentPage=1&pageSize=${pageSize }">首页</a>
										多个参数用&号连接,

复合查询

arseInt(request.getParameter(“pageSize”));


注意:此时根据选择分页已经完成,但是当你点击下一页的时候,又变成了默认的5条,就需要将pageSize在每个路径后面都加上此参数,即首页、上下一页、尾页跳转跟参数pageSize,辨识分页。

```jsp
//示例:
<a href="ProviderServlet?currentPage=1&pageSize=${pageSize }">首页</a>
										多个参数用&号连接,

复合查询

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱尔斯Jules

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值