JSP基本语法

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

未完成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容