美文网首页
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基本语法

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