文章目录
1 JSP
java servlet page(本质上是一个servlet)
jsp:第一次访问,把先jsp翻译成一个java文件,然后再进行编译class
1.1 JSP基本语法
指令元素;脚本元素;动作元素
- 指令:
page
配置jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
contentType==> response.setContentType():设置响应体类型以及字符集;
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面;
isErrorPage:标识当前也是是否是错误页面,true是,可以使用内置对象exception;false否,默认值,不可以使用内置对象exception
include
页面包含,导入页面的资源文件
< %@include file = “top.jsp” >
taglib
导入资源
- 脚本: < % 在service中添加内容 % >
- 表达式: < %= 放进service中,等同于out.print(),等同于EL表达式 % >
- 声明 : < %! 方法 % > 写在类中
1.2 九大内置对象
隐含对象:
request, response, session, application, config
page, pageContext, exception, out(ajax所有的响应)
1.3 四大作用域
四种范围对象作用域从小到大顺序如下:pageContext----request----session----application。
- page页面域:作用域当前页面
近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。 - request请求域:作用域当前请求
请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。 - session会话域:当前会话
会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。 - application应用域:整个应用程序
应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。
后端服务器的三个作用域对象:
在Servlet里可以用一个名字绑定一个对象
谁能看到并使用这个属性,它能存活多久
2 MVC模式
在模型1中,JSP页面嵌入大量的流程控制语句以及部分的业务逻辑代码;
可以将这部分代码提取,放置到一个单独的组件中,这个组件叫控制器,而引入了控制器的web程字架构就是Model2;
Model 2符合MVC架构模式
➢M—Model: javabean业务逻辑处理中心(service,bean,util,dao)
➢V—View: jsp.html 界面展示
➢C—Controller: Servlet 接收请求和调用JavaBean来进行相应的响应
2.1 Model 2中MVC的角色
➢Servlet作为控制器层组件:
负责接收请求
实例化JavaBean且对业务逻辑进行处理
为JSP准备承载了数据的JavaBean
将请求转发给适合的JSP页面
➢JSP作为视图层组件:
负责提交用户请求至控制器
负责页面数据的动态显示
➢JavaBean作为模型层组件:
JavaBean主要有两类:
一类用于封装业务逻辑;一类用于承载数据
2.2 Model2优缺点
优点:
➢将页面显示、业务逻辑和流程控制分离开来
➢JSP负责页面的动态显示
➢JavaBean负责承载数据和业务处理
➢Servlet 负责流程的控制
➢有利于前台页面处理人员和程序开发人员的分工
缺点:
➢加大了程序开发的复杂度
3 分页技术
3.1 前端分页
一次性把所有数据请求放置前端,利用js来进行分页展示
前端控件
https://datatables.net/
<!--引用-->
<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.min.css">
<script type="text/javascript" src="js/jquery-1.7.1.min.js" language="JavaScript"></script>
<script type="text/javascript" src="js/jquery.dataTables.js" language="JavaScript"></script>
<script type="text/javascript" src="js/jquery.dataTables.min.js" language="JavaScript"></script>
<!--js写法-->
<script>
$(function(){
$("表格").dataTable({
/*基本参数设置,以下参数设置和默认效果一致*/
"iDisplayLength":5,//设置每页的行数
"bPaginate": true, //翻页功能
"bLengthChange": true, //改变每页显示数据数量
"bFilter": true, //过滤功能
"bSort": true, //排序功能
"bInfo": true,//页脚信息
"bAutoWidth": true,//自动宽度
/*默认排序设置*/
"aaSorting": [[ 0, "desc" ]],//设置第5个元素为默认排序
/*默认翻页样式设置*/
"sPaginationType": "full_numbers",
/*是否开启主题*/
"bJQueryUI": true,
/*语言设置*/
"oLanguage": {
"sLengthMenu": "每页显示 _MENU_条",
"sZeroRecords": "没有找到符合条件的数据",
"sInfo": "当前第 _START_ - _END_ 条 共计 _TOTAL_ 条",
"sInfoEmpty": "木有记录",
"sInfoFiltered": "(从 _MAX_ 条记录中过滤)",
"sSearch": "搜索:",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "前一页",
"sNext": "后一页",
"sLast": "尾页"
}
}
}
);
});
</script>
3.2 后端分页
每次只获得当前页的数据
4 过滤器
4.1 概述
一个中间组件,用于拦截源数据和目的数据间的消息;
过滤二者之间传递的数据;
所有的过滤器必须实现javax.servlet.Filter接口
Web应用上部署多个过滤器
过滤器可以组成一个过滤器链。 链中的每个过滤器负责特定的操作和任务,客户端的请求和响应在这些过滤器之间传递。
4.2 过滤器实现
- 实现接口Filter
- 实现接口方法init, doFilter, destroy
- 配置 web.xml
<!-- 实例化-->
<filter>
<filter-name> setEdingcodeFilter </filter-name>
<filter-class> filter.SetEncodingFilter </filter-class>
</filter>
<!--要过滤请求-->
<filter-mapping>
<filter-name> SetEdingcodeFilter</filter-name>
<url-pattern> / * <url -pattern>
/* *.do /SelectAll /page/*---过滤所有Page下的请求 */
</filter-mapping>
5 监听器
监听session, request, application这三个对象里存取数据的变化;
监听器对象可以在事情发生前、发生后可以做一些必要的处理;
Servlet监听器主要目的是给Web应用增加事件处理机制,以便更好地监视和控制Web应用的状态变化。
5.1 监听器小案例
//过滤器,设置编码字符集
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter("/*")
public class SetEncodingFilter implements Filter {
private FilterConfig config;
public SetEncodingFilter() { }
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤器,设置编码字符集");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//放行,进入下一个过滤器
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
}
}
//request.getSession().setAttribute("user", username);
//在LoginServlet中要先放入对象,在过滤器中判断数据是否为空
@WebFilter(urlPatterns= {"/page/*", "*.do"}) //过滤所有 page目录下的页面,后缀为.do的servlet
......
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 判断是否存在数据,存在数据:之前登陆过,没有数据说明没有登录过
Object object = ((HttpServletRequest) request).getSession().getAttribute("user");
System.out.println("---------");
if(object != null) {
System.out.println(object);
chain.doFilter(request, response);
} else {
((HttpServletRequest) request).getSession().setAttribute("msgss", "请先登录");
// 路径上的处理 /直接把项目路径抹去 拼接成请求路径
//((HttpServletResponse)response).sendRedirect("/webDay7/index.jsp");
((HttpServletResponse)response).sendRedirect("/music/login.jsp");
}
}