知识点的叙述:
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>
多个参数用&号连接,