什么是JSP
jsp全称是Java Server Pages,它和Servlet技术一样都是sun公司定义的一种用于开发动态web资源的技术。主要是和serlvet一起做web端的,也就是做动态页面用的。事实上jsp是一个特殊的Servlet实例,它跟其他Servlet一样被Servlet容器执行,在这之前它需要先被jsp容器转换成Servlet,这个过程是在服务器端产生的,在第一次编译之后该Servlet实例便常驻内存。
JSP语法
(1)jsp模板元素
Jsp页面中的html内容称之为jsp模板元素。Jsp模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
(2)jsp脚本表达式
Jsp脚本表达式用于将程序数据输出到客户端:
语法:<%=x%>
Jsp引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输出给客户端。
(3)jsp脚本片断
Jsp脚本片断用于在jsp页面中编写多行java代码。
语法:<% 多行java代码 %>
注意:jsp脚本片断只能出现java代码,不能出现其它模板元素,jsp引擎在翻译jsp页面中,会将jsp脚本片断中的java代码将被原封不动地放到servlet中的_jspServlet方法中。Jsp脚本片断中的java代码必须严格遵循java代码,例如,每执行语句后面必须用分号结束。
在一个jsp页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、html标记和其他jsp元素。多个脚本片断的代码可以相互访问,就像将所有的代码放在一对<%%>之中的情况。
单个脚本片断中的java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的java语句,例如:
<%
for(int i = 0; i < 5; i++)
{
%>
<H1>JSP</H1>
<%
}
%>
(4)jsp声明
Jsp页面中编写的所有代码,默认会翻译到servlet的service方法中,而jsp声明中的java代码会被翻译到 _jspService 方法的外面。语法:
<%! Java代码 %>
所以,jsp声明可以用于定义jsp页面转换成的servlet程序的静态代码块、成员变量和方法。多个静态代码块、变量和函数可以定义在一个jsp声明中,也可以分别单独定义在多个jsp声明中。Jsp隐式对象的作用范围仅限于servlet的 _jspServeice 方法,所以在jsp声明中不能使用这些隐式对象。
注意:不能在jsp中定义名字为 jspInit 或 jspDestroy 的方法,这样在将jsp翻译成servlet时会将原带的相关方法覆盖掉。
(5)jsp注释
Jsp中使用<%--注释信息--%>格式添加注释,但是注意:这个和html页面中的不同的是,jsp中的注释信息不会被翻译到servlet中,这样就不会被显示在页面上,但是html中的注释是会被发送到浏览器中的。
5. jsp指令
(1)Jsp指令是为jsp引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面中的其余部分。一共有三个指令:page指令、include指令、taglib指令。这里只讲前两个,最后一个是用于自定义标签上的,以后会讲。
jsp指令有以下三种:
page指令:称为页面指令,用来定义jsp页面的全局属性。语法格式如下:<%@ page [属性="值" 属性="值"]%>
# include指令:是加载文件指令,它在jsp被编译前就将文件加载进jsp中合并成一个新的jsp文件,因此当该文件改变时,jsp要重新被编译一次。include指令的格式如下:<%@ include file = "path"%>该指令只有一个属性file,该指令用于指向要加载的文件的相对地址
taglib指令:是用来引用标签库并设置标签库前缀,说白了就是自定义自己的jsp标记。格式如下:<%@ taglib uri="标签库地址" prefix = "标签库前缀" %>使用标记方式如下:<标签库前缀:标签名 参数>
结合serlvet的知识,以下是一个结合serlvet使用的Jsp实例,也就是一个简单的MVC结构的实例。
//modell.java
import java.util.Arrays;
import java.util.List;
public class modell {
public List<String> getData(){
String []name={"张三","李四","王五"};
//将数组数据返回
return Arrays.asList(name);
}
}
//ControllServlet
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ControllServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
modell md=new modell();
List<String>list =md.getData();
request.setAttribute("LIST", list);
request.getRequestDispatcher("/view.jsp").forward(request,response);//方法返回的是一个对象,再一点就是这个对象再调用这个方法,因为类成员可以使另一个类的对象。
}
}
//JSP
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>JSP测试</title>
</head>
<body>
<%
//从request域对象中获取LIST字符串所对应的集合
List<String> list = (List<String>)request.getAttribute("LIST");
%>
<table border="2" align="center" width="30%">
<caption><h2>text</h2></caption>
<thead>
<tr>
<th>XXX</th>
</tr>
</thead>
<tbody align="right">
<%for(String name : list){%>
<tr>
<td>
<%=name%>
</td>
</tr>
<%}%>
</tbody>
</table>
</body>
</html>
网友评论