Jsp
Java Server Pages java服务器页面 底层为简化的Servlet 支持跨平台
Jsp使用
导包
import="com.io.* //如果需要导入多个包 用逗号隔开
Session
session="true"//session默认不支持 将其改为true就支持了
当页面出错时自动跳转
errorPage="error.jsp"//页面出错会跳转到error.jsp页面
在jsp中写Java
<%%>//强制要求按该格式写
例:
<% System.out.println(1/0); %>
//会跳转到error.jsp页面
在jsp中写成员变量
<%! %>//要在第一个%后加!
引入jsp模板
<%@ include file="error.jsp"%>
jsp跳转servlet取值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
%>
<html>
<head>
<base href="<%=basePath%>"><!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="ServletA">
<jsp:param name="uname" value="张三"/>
</jsp:forward>
</body>
</html>
@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setContentType("text/html;charset=UTF-8");
String uname = req.getParameter("uname");
resp.getWriter().println("取到a.jsp中传来的数据:"+uname);
System.out.println(uname);
}
}
jsp九大内置对象
pageContext:上下文对象 作用于当前页面
request:封装当前请求数据的对象 一次请求 由tomcat服务器创建
response:响应客户端信息
session:存储一次会话 将数据一次请求流转给其他请求 一个用户的不同请求共享数据
application:相当于ServletContext 存储不同用户的共享数据 将数据从一个用户流转给其他用户
out:(效率高)jsp的响应对象 相当于resp.getWrite.write()
page:当前的对象 相当于java中的this关键字
exception:异常
config:相当于ServletConfig
jstl el表达式(建议百度)
通过el表达式取值
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="com.pojo.T_Stu" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
%>
<html>
<head>
<base href="<%=basePath%>"><!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<body>
<%
ArrayList<String> list=new ArrayList();
list.add("黑");
list.add("吉");
list.add("辽");
session.setAttribute("list",list);
HashMap<String,Integer> map=new HashMap();
map.put("a",10);
map.put("b",20);
map.put("c",30);
session.setAttribute("map",map);
ArrayList<T_Stu> stu=new ArrayList();
stu.add(new T_Stu("张三","333"));
stu.add(new T_Stu("李四","444"));
stu.add(new T_Stu("王五","555"));
session.setAttribute("stu",stu);
%>
${list.get(0)}${list.get(1)}${list.get(2)}
${map.a}${map.b}${map.c}
${stu}
</body>
</html>
jstl表达式
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
需要导入jar包支持
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
<base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<script src="js/jquery-3.5.1.js"></script>
<script>
$(function () {
$.get("AjaxServlet",{"name":"张三","age":12},
function (data){
alert(data)
})
})
</script>
<body>
</body>
</html>
@WebServlet("/AjaxServlet")
public class AjaxServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name+"----"+age);
resp.getWriter().write("AjaxServlet响应");
}
}
优先级
pageContext > request > session > application
拦截器
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
<base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<body>
欢迎${uname}登录
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath(); //获取当前工程的根目录
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
<base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
<title>Title</title>
</head>
<body>
<form action="login" id="loginForm">
用户名:<input type="text" name="uname" id="uname">
<button type="button" onclick="Loogin()">登录</button>
</form>
<script src="js/user.js" type="text/javascript"></script>
</body>
</html>
function Loogin() {
var uname=document.getElementById("uname").value
alert(uname);
if(uname!=null&&uname.trim()!=null){
document.getElementById("loginForm").submit();
}
}
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("用户登录");
String uname = req.getParameter("uname");
System.out.println(uname);
//判断用户名
if("admin".equals(uname)) {
req.getSession().setAttribute("uname", uname);
//重定向
resp.sendRedirect("index.jsp");
}else{
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("LoginFilter初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("LoginFilter正在拦截");
//基于Http请求的
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
//filterChain.doFilter(req,resp);//放行所有
//当用户没有登陆时 拦截请求 跳转到登录页面
//resp.sendRedirect("login.jsp");//这段代码也是请求 会多次请求 又进到过滤器无限循环
//指定放行页面 静态资源 登录注册页面都要放行
//先获取请求的路径
String uri = req.getRequestURI();
//登录页面放行
if(uri.contains("login.jsp")){
filterChain.doFilter(req,resp);
return;
}
//静态资源放行
if(uri.contains("/js")||uri.contains("/css")||uri.contains("/img")||uri.contains("/html")){
filterChain.doFilter(req,resp);
return;
}
if(uri.contains("/login")){
filterChain.doFilter(req,resp);
return;
}
String uname =(String)req.getSession().getAttribute("uname");
if(uname!=null){
filterChain.doFilter(req,resp);
return;
}
resp.sendRedirect("login.jsp");
}
@Override
public void destroy() {
System.out.println("LoginFilter销毁");
}
}
监听器
@WebListener("/MyRequestLisenter")
public class MyRequestLisenter implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("销毁");
ServletRequest request = sre.getServletRequest();
HttpServletRequest req =(HttpServletRequest) request;//必须执行这一步
try {
req.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
String name = req.getParameter("name");
String age = req.getParameter("pwd");
System.out.println(name+"-------"+age);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("初始化。。。程序运行先执行这个");
}
}
@WebListener
public class OnlineListener implements HttpSessionListener {
//在线人数初始化
private Integer onlineNumber=0;
@Override
public void sessionCreated(HttpSessionEvent se) {
onlineNumber++;
//将人数通过 se 设置到session中
//se.getSession().setAttribute("onlineNumber", onlineNumber);
//保证同步需要设置在servletContext作用域中
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
onlineNumber--;
//将人数通过 se 设置到session中
//se.getSession().setAttribute("onlineNumber", onlineNumber);
//保证同步需要设置在servletContext作用域中
se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
}
}
@WebServlet("/online")
public class OnlineServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
HttpSession session = req.getSession();
String key = req.getParameter("key");
System.out.println(key);
if(key!=null && "logout".equals(key)){
session.invalidate();
return;
}
Integer onlineNumber =(Integer)session.getServletContext().getAttribute("onlineNumber");
resp.getWriter().write("<h2>当前在线人数</h2>:"+onlineNumber+"<a href='online?key=logout'>退出</a>");
}
}