美文网首页
JSP基本语法

JSP基本语法

作者: 每天要吃三个小朋友 | 来源:发表于2017-05-10 13:54 被阅读0次

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

未完成

相关文章

  • JSP入门

    JSP的基本语法:1.JSP声明语法。2、JSP程序脚本。3、JSP脚本注释。4、JSP内容输出表达式。5、JSP...

  • JavaEE-9-JSP

    1、JSP的四种基本语法 生成输出内容 JSP注释:<%-- --%> JSP声明:<%! %> JSP输...

  • JSP基本语法

    JSP声明语法 语法格式: 声明成员变量: <%! String str="Hello World";%> <%...

  • JSP基本语法

    JSP本质是Servlet,每个JSP页面就是一个Servlet实例。在Tomcat中,JSP生成的Servlet...

  • JSP基本语法

    在传统的HTML页面文件中潜入脚本语言和JSP标签就构成了一个JSP页面文件。一个JSP页面可由5种元素组合而成:...

  • JSP基本语法

    jsp代码中包含jsp元素和Template data两类。Template data 指的是jsp引擎不处理的部...

  • JSP基本语法

    JSP文件是在传统的网页HTML中加入Java程序片段,就构成了JSP网页。Web服务器在遇到访问JSP网页的请求...

  • JAVA Web学习(7)___第5章 JSP基本语法

    第5章 JSP基本语法 5.1了解JSP页面 5.2指令标识 语法格式 JSP三种指令标签 5.2.1 page指...

  • (2) jsp基本语法

    警告:String literal is not properly closed by a double-quot...

  • java基础-day43-JSP

    JSP 1. JSP 1.1 JSP概述 1.2 为什么要用JSP 1.3 JSP语法 1.3.1 JSP语法格式...

网友评论

      本文标题:JSP基本语法

      本文链接:https://www.haomeiwen.com/subject/eoxptxtx.html