JSP本质是Servlet,每个JSP页面就是一个Servlet实例。在Tomcat中,JSP生成的Servlet放在work路径对应的web应用下。
4种基本语法
注释
<%-- JSP注释内容 --%>
(注意与html注释区分,<!-- html注释内容 -->)
JSP注释在浏览器中是不能通过查看源代码看到的。
声明
<%! 声明部分 %>
依然需要遵循java基本语法规则,例如
<%!
<%-- 声明int变量 -->
public int x;
<%-- 声明一个方法 -->
public String info(){
return "hello"
}
%>
输出JSP表达式
<%=表达式%>
下面用输出表达式的方式输出变量和方法返回值
<head>
<title>输出表达式值</title>
</head>
<%!
public int count;
public String info(){
return "hello";
}
%>
<body>
<!-- 使用表达式输出变量值 -->
<%=count++%>
<br/>
<!-- 使用表达式输出方法返回值 -->
<%=info()%>
</body>
JSP脚本
所有可执行的java代码都可以通过JSP脚本嵌入到html中,例如:
<body>
<table bgcolor="#9999dd" border="1" width="300px">
<%
for (int i = 0; i < 10; i++){
%>
<!-- 上面的循环将控制<tr>标签循环 -->
<tr>
<td>循环值:</td>
<td><%=i%></td>
</tr>
<%
}
%>
</table>
</body>
隐式对象
JSP为每个页面提供了一些java对象,不需要声明即可使用,常用的有:
request对象
HttpServletRequest类的实例,使用getHeaderNames()方法可以获取信息头(Enumeration型)。
<table width="100%" border="1" align="center">
<tr>
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
其他常用方法:
- Cookie[] getCookies() 获取客户端所有Cookie
- Enumeration getAttributeNames() 获取request对象的所有属性名称
- HttpSession getSession() 返回request的Session对象,如果没有则创建一个
- Object getAttribute(String name) 返回名称为name的属性值,如果不存在则返回nul
- String getCharacterEncoding() 返回request的字符编码集名称
- String getRemoteAddr() 返回客户端的ip地址
- String getRemoteUser() 返回客户端登陆的用户
response
是HttpServletResponse类的实例,通常用来添加Cookie、状态码和时间戳等。
例如实现一个每秒刷新的页面不停的请求服务器当前时间:
<body>
<%
// 设置每隔1秒自动刷新
response.setIntHeader("Refresh", 1);
// 获取当前时间
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
out.println("当前时间: " + CT + "\n");
%>
</body>
out
out是 javax.servlet.jsp.JspWriter 类的实例,用来在response中写入内容。
- out.print() 输出值
- out.println() 输出值然后换行
- out.flush() 刷新输出流
page
page就是当前整个页面,相当于java里的this
exception
之前页面抛出的异常
session
是 javax.servlet.http.HttpSession 类的实例
application
是javax.servlet.ServletContext 类的实例
config
是 javax.servlet.ServletConfig 类的实例
处理表单
当使用get方法时
一个html文件:
<body>
<form action="main.jsp" method="GET">
站点名: <input type="text" name="name">
<br />
网址: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
html里用到的main.jsp:
<body>
<h1>使用 GET 方法读取数据</h1>
<ul>
<li><p><b>站点名:</b>
<%= request.getParameter("name")%>
</p></li>
<li><p><b>网址:</b>
<%= request.getParameter("url")%>
</p></li>
</ul>
</body>
当使用post方法时
一个html文件,提交checkbox:
<body>
<form action="main.jsp" method="POST" target="_blank">
<input type="checkbox" name="google" checked="checked" /> 熏肉大饼
<input type="checkbox" name="runoob" /> 鱼香肉丝
<input type="checkbox" name="taobao" checked="checked" /> 锅包肉
<input type="submit" value="中午吃啥" />
</form>
</body>
以下为main.jsp,获取checkbox的数据:
<body>
<table>
<tr>
<th>参数名</th><th>参数值</th>
</tr>
<%
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getParameter(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</body>
过滤器 Filter
Filter的作用
- 在客户端的请求访问后端资源之前,拦截这些请求
- 在服务器的响应发送回客户端之前,处理这些响应
它是实现了 javax.servlet.Filter 接口的 Java 类,定义了3个方法:
- public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
- public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
- public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
Filter 的 init 方法中提供了一个 FilterConfig 对象,如果在web.xml中定义了如下参数
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>包名.类名</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>赵日天</param-value>
</init-param>
</filter>
那么就可以在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String name = config.getInitParameter("name");
// 输出初始化参数
System.out.println("我叫: " + name);
}
一个简单的JSP过滤器
当我们访问localhost:8080/HeadDisplay时,展示request信息头的所有参数,代码如下
web.xml中创建Filter标签:
<web-app>
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.runoob.test.LogFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>赵日天</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/HeadDisplay</url-pattern>
</filter-mapping>
<servlet>
<!-- 类名 -->
<servlet-name>DisplayHeader</servlet-name>
<!-- 所在的包 -->
<servlet-class>包名.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/HeadDisplay</url-pattern>
</servlet-mapping>
</web-app>
Servlet过滤器如下:
import javax.servlet.*;
import java.util.*;
//实现 Filter 类
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String site = config.getInitParameter("name");
// 输出初始化参数
System.out.println("调用了init方法,我叫 " + name);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
System.out.println("调用了doFilter方法");
// 把请求传回过滤链
chain.doFilter(request,response);
}
public void destroy( ){
/* 在 Filter 实例被 Web 容器从服务移除之前调用 */
System.out.println("调用了destroy方法");
}
}
HeaderDisplayer.java如下
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HeaderDisplay")
public class DisplayHeader extends HttpServlet {
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "展示request消息头";
String docType =
"<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n"+
"</tr>\n");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
web.xml配置说明
<filter>
<filter-name>过滤器名
<fliter-class>过滤器类名,要完整的,含包名
<init-param>设定初始化参数
<param-name>参数名
<param-value>参数值
<filter-mapping>拦截的请求路径,写成 /* 可拦截所有请求
<filter-name>同上
<url-pattern>所拦截的请求路径
<servlet-name>指定拦截该servlet。不同于上面的拦截请求路径,这是filter的第二种拦截方式
Cookie
未完成
Session
未完成