jsp是什么?
jsp本质上就是Servlet,当我们访问jsp页面时,Tomcat会将jsp转化为Servlet类,再将java代码转化为字节码文件,它的作用主要负责与用户交互,将最终的界面呈现给用户。
jsp示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
jsp页面访问内容,当服务器接受到一个后缀为.jsp请求时,将该请求交给jsp引擎去处理,每一个jsp页面第一次被访问时,jsp引擎会将它翻译成一个Servlet文件也就是java文件,再由Tomcat容器来调用Servlet,完成响应
jsp用Servlet来代替
Servlet代码示例
@WebServlet("/jsp")
public class ServletReplaceJsp extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("<title>Title</title>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<h1>Hello World</h1>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Servlet访问页面内容
由此可见jsp是向浏览器响应一个个字符串的HTML标签,最终被浏览器解析成我们看到的效果
通过看Tomcat将jsp转化为Servlet类的文件
HttpJspBase继承了HttpServlet,因此属于Servlet
为什么使用jsp而不用HTML
- jsp页面内能写java程序,能将html、css、js、java嵌套在一起使用,可以产生数据用于交互
- 而HTML中不能写java程序,这样的写的页面没有数据,单纯是静态页面
jsp嵌入java方式
- jsp脚本,执行java逻辑代码
<% java代码 %>
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello World</h1>
<%
System.out.println("Hello World");
%>
</body>
</html>
页面访问后输出
- jsp声明:定义java方法
<%!
声明java方法
%>
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello World</h1>
<%!
//该声明只能定义方法不能执行方法,执行方法只能用执行java逻辑代码的脚本执行
public void test(){
System.out.println("hello world");
}
%>
<%
//调用方法,执行逻辑代码
test();
%>
</body>
</html>
访问后执行结果:
- jsp表达式:将java代码直接输出到html页面中
<%= java变量 %>
代码示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello World</h1>
<%!
//该声明只能定义方法不能执行方法,执行方法只能用执行java逻辑代码的脚本执行
public String test(){
return "HelloWorld";
}
%>
<%
//调用方法,执行逻辑代码
String str=test();
%>
<%=str%>
</body>
</html>
访问后执行:
jsp内置对象
- request:表示一次请求,来自HttpServletRequest对象
- response:表示一次响应,来自HttpServletResponse
- pageContext:表示页面上下文,获取页面信息
- session:表示一次对话,保存用户信息,来自HttpSession
- application:表示当前Web应用,全局对象,保存所有用户共享信息,来自ServletContext
- config:表示当前jsp对应的Servlet的ServletConfig对象。获取当前Servlet配置信息
- out:表示向浏览器输出内容,来自JspWriter继承Writer
- page:表示当前jsp对应的Servlet对象
- jsp页面发生异常,Exception
request常用方法:
- getParameter(String name):获取客户端传来的参数
get请求方式传参,?拼接参数名;=拼接参数值;如果还有其他参数用&分割;get请求方式参数有限
测试示例:
- setAttribute(String key,Object value):通过键值对的方式保存数据,用于服务器内部进行调用
- getAttribute(String key):通过key取出value值
- getRequestDispatcher(String path):获取请求转发器对象,传入请求转发的地址;该对象有一个forward(ServletRequest,ServletResponse)方法用来转发请求,传入封装的请求对象和封装的响应对象
测试示例:
hello.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//通过浏览器获取参数值
String name = request.getParameter("name");
//设置服务器内部属性(键值对保存数据)
request.setAttribute("名字",name);
//请求转发到jsp页面
request.getRequestDispatcher("test.jsp").forward(request,response);
%>
</body>
</html>
test.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>test</title>
</head>
<body>
<h1>test</h1>
<%
//通过请求对象,获取服务器内部设置属性值
String name = (String) request.getAttribute("名字");
%>
//输出到浏览器
<%=name%>
</body>
</html>
- getParameterValues(String name)获取浏览器客户端传入的多个同名参数值,返回结果为数组类型
测试示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//获取客户端传入的多个同名参数
String[] names = request.getParameterValues("name");
%>
//输出到浏览器
<%=Arrays.toString(names)
%>
</body>
</html>
Response常用方法:
- sendRedirect(String path):重定向到某个页面,页面之间的跳转,传入一个页面地址
测试示例:
resp.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>resp</title>
</head>
<body>
<%
response.sendRedirect("target.jsp");
%>
</body>
</html>
target.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>target</title>
</head>
<body>
<%
out.write("跳转到目的页面");
%>
</body>
</html>
转发getRequestDispatcher().forward()与重定向response.sendRedirect()区别
- 转发是将同一个请求传给下一个页面(服务器之间的传递,也就服务器跳转),地址栏不会发生变化;
- 重定向是创建一个新的请求传给下一个页面(客户端发送一次新的请求来访问跳转后的目标资源),地址栏会发生变化,之前的请求生命周期已经结束
- 如果两个页面之间需要通过request来传值,则必须用转发,不能使用重定向
Session对象
它是用户对话,由于服务器无法识别每一次Http请求的出处(不知道来自于哪个终端),它只会接受一个请求信号,所以存在一个问题:将用户的响应发送给其他人,必须有一种技术来让服务器知道请求来自哪,这就是会话技术
- 会话就是客户端和服务器之间发生的一系列连续的请求和响应的过程,它存在于打开浏览器进行操作到关闭浏览器的过程。
- 会话状态:指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的一系列请求和响应关联起来
- 属于同一次会话的请求都有一个相同的标识符,叫sessionID
session常用的方法:
- String getId():获取sessionID
- setMaxInactiveInterval(int interval):设置session 失效时间,单位为秒
- invalidate():使session立即失效
- setAttribute(String key,Object value):通过键值对来存储数据
- Object getAttribute(String key):通过键获取对应的数据
- removeAttribute(String key): 通过键删除对应的数据