sun公司制定的一种服务器端动态页面技术规范
生成动态页面
jsp其实是一个以.jsp为后缀的文件,该文件的内容主要是html和少量的java代码
容器会将jsp文件自动转换成一个servlet然后执行。
如何写一个jsp文件
1、创建一个以.jsp为后缀的文件
2、在文件里面添加如下的内容:
(1)html(css,js):直接写。不用写out.print
(2)java代码:
a、java代码片段 <% java语句; %>
b、jsp表达式
<%= java表达式%>
在 service方法里,使用out.print(java表达式)输出
(3)隐含对象
在jsp文件里面,可以直接使用的对象,比如 out,request,response
为什么可以直接使用这些隐含对象。
容器会自动生成获得这些对象的代码
但是容器在默认情况下只会默认导入servlet的几个包,要是想用其他的包,就要用到指令
指令:
通知容器在将jsp文件转换成servlet类时,做一些额外的处理,比如导包。
指令的语法:
<%@指令名称 属性=属性值 %>
a、import属性:导包
比如: <%@page import=”java.util.*”%>
要导多个包,可以用逗号隔开
代码
hello.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>hellotitle>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
head>
<body>
date:
<%
Date date = new Date();
out.print("date:"+date);
%>
<br>
<%
for(int i=0;i<10;i++){
out.print("hello,Recar
");
}
%>
body>
html>
或者这么写
current time:<%= new Date() %><br>
就是写个等于 后面就等于把等于后面的语句写在out.print里
叫做表达式
不是一个语句。所以最后都没有写分号
创建jsp文件在webroot下。正常写html。要写java的时候外面套个<%%>就可以了
输出的话还是 out.print( )
容器会帮我们把jsp转换成servlet类~
对于jsp中html用out.write
对于java代码直接照搬
然后容器调用servlet
这里的可以直接用out,因为他会在转成servlet的时候会帮你定义 out
当然也可以直接用request和response
这些个就叫做隐含对象
就是这句话
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
最后一个属性就是编码,我设置的是utf-8,不然默认是iso
pageEncoding属性:告诉容器jsp文件的编码。有些容器,在读取jsp文件的内容时,默认为按照iso-8859-1去解码,如果jsp文件里面包含了中文,会出现乱码
可以用标签来引入css文件
1、后缀匹配 *.do
2、分析请求资源路径
String uri = request.getRequestURI() 这个就是获取请求资源路径
可以把uri.substring()来截取字uri来分析请求资源路径
比如第最后一个/最后一个.中间的
一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续做。
比如,一个servlet将处理结果转发给一个jsp来展现
如何转发:
1、绑定数据(处理结果)到request上
request.setAttribute(String name ,Object obj)
根据绑定名获得绑定值
Object request.getAttribute(String name)
2、获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String uri);
uri: 转发的地址。
3、转发:
rd.forward(request,response)
实例:
在emplist servlet中把out.print都删了加上转发,让其查询出来的List转发到jsp中。让jsp作为显示
EmployeeDAO dao = new EmployeeDAO();
List employees = dao.findAll();
//使用转发,将处理转交给emplist.jsp
//1、绑定数据
request.setAttribute("emplist", employees);
//2、获得转发器.转发的目的地
RequestDispatcher rd = request.getRequestDispatcher("emplist.jsp");
//3、转发
rd.forward(request, response);
jsp就直接获取就可以了。但是要注意转换类型。
还有名字要写对!!!
<%
List employees = (List) request.getAttribute("emplist");
for(int i=0;iget (i);
%>
最后访问的是 emplist !!!!不是emplist.jsp
因为是访问emplist,然后查询出来的employees转发到emplist.jsp 然后用jsp把查询的显示出来。
a、转发之后,浏览器地址栏的地址不变。
b、转发地址有限制(必须是同一个应用)
告诉容器,在将jsp文件转换成servlet类时,将file属性指定的文件的内容插入到该指令所在的位置
比如: <%@include file=”heard.jsp”%>
可以分开写,方便更改
取消浏览器的默认行为,就是说,一般连接,点击了或者表单点击提交,浏览器都会处理。但是加个 οnclick=”return false”就会禁止了。无论怎么点都没用
如果写 return confirm(‘是否确定删除,取消就相当于false,确定就是true’)
<a href="del?id=<%=e.getId() %> " onclick="return confirm('是否确定删除<%=e.getName() %>')" >删除a>
jsp只是用来展示
servlet来处理,把处理得到的数据转发给jsp 就用到转发。
然后用到jsp的标签等
1、编程式处理
a)捕获异常
b)转发给一个jsp
比如:
request.setAttribute(“error_msg”,”系统繁忙,稍后重试”);
request.getRequestDispatcher(“error.jsp”).forward(request,response);
2、声明式处理(即交给容器来处理)
a)捕获异常,然后抛出异常给容器
b)配置处理页面
<error-page>
<exception-type> 异常类型exception-type>
<location>显示的异常页面location>
error-page>
声明式异常常用来处理系统异常(异常发送之后不能恢复,比如数据库服务停止)。发生这类异常之后,提示用户稍后重试即可
编程式异常(转发的方式)更灵活,可以用来处理应用异常(比如用户输入错误的密码等。)
可以把所有servlet放在一个里面
创建servlet
然后对请求资源路径进行判断做不同的操作,就把之前写的servlet对应的每个判断下写。
1、转发所涉及的各个web组件可以共享同一个rquest对象,重定向不可以
容器收到请求之后会创建请求对象和响应对象,当响应发送完毕,容器会立即删除request对象和response对象。也就是request对象和response对象的生存时间是一次请求和响应期间
重定向是两次请求
2、重定向之后,浏览器地址栏的地址会变;转发不变。
3、重定向地址是任意的,而转发地址必须是同一个应用
4、转发是一件事未完成,而重定向是一件事已经完成。
连接地址,表单提交地址,重定向,转发这四种情况下,如果填写路径。
<a href =””>a>
<form action=””>
request.sendRedirect(“”);
request.getRequestDispatcher(“”);
(1)相对路径
不以”/”开头的路径
(2)绝对路径
以”/”开头的路径
(3)如何去写绝对路径
链接地址,表单提交地址,重定向从应用名开始写;
转发从应用名之后开始写
最好写绝对路径
String request.getContextPatch();
来获得实际部署时的应用名
也就是说写绝对路径的时候,写 request.getContextPatch(); 就可以当应用名了。
因为有可能会改变应用名