美文网首页
JSP(JavaServer Pages)

JSP(JavaServer Pages)

作者: qpanpan | 来源:发表于2016-10-05 19:11 被阅读0次

    示例文档

    1. 简化Servlet编写的一门技术
    2. .jsp文件会被转换成.java文件,然后编译生成.class文件。
    3. 实际处理请求时会加载.class文件,然后创建对象去处理
    4. 通过URL直接访问。http://..../xx.jsp

    语法

    1. <% %>。可嵌入java代码
    <%
        int a = 5;
        out.println(a);
    %>
    
    1. <%= %>。可嵌入表达式
    <%=1+3+5*6 %>
    

    MyEclipse新建.jsp文件

    1. 新建Java Web项目
      Package Explorer -> 右键选择 Web Project -> Project Name处输入项目名称 -> Finish
    2. 新建.jsp文件
      WebRoot -> 右键选择 New -> Other -> 选择 JSP(Basic templates)
      会看到生成的文件中包括如下的内容(默认编码“ISO-8859-1”,不能输入中文)
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
    <!DOCTYPE html>
    <html>
          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
              <title></title>
          </head>
          <body>
          </body>
    </html>
    
    1. 修改MyEclipse配置
    • 修改jsp编辑器
      .jsp文件 -> 右键 Open With -> MyEclipse JSP Editor(无预览效果)
    • 修改jsp默认编码
      window -> Preferences -> MyEclipse -> Files and Editors -> JSP -> 修改Encoding 值为UTF-8

    原理分析

    浏览器请求的资源,是由服务器处理后返回的。所以服务器使用的文件和开发环境中的文件是两个文件。如下图所示的方式打开服务器端文件路径:\work\Catalina\localhost\项目名\org\apache\jsp

    jsp.png

    打开.java文件,可以看到如下图所示内容(很明显,它是继承自HttpJspBase类的子类。它是Tomcat的一个类)

    java.png

    通过查看源码可以看到如下定义(其实它也是一个Servlet)

    public abstract class HttpJspBase extends HttpServlet
    

    在 _jspService 方法中可以看到request, response, out的定义,HTML标签的处理,java代码的处理

    _jspService.png

    归纳

    访问 http://..../xx.jsp 时,Tomcat服务器会根据xx.jsp来生成一个xx_jsp.java的文件,所有的html标签,java代码等都在_jspService方法中进行翻译拼接。然后服务器会加载该java文件,生成Servlet对象来处理请求、响应结果。


    page指令

    指令 含义
    @ page
    language="java" 生成java文件
    contentType="text/html; charset=utf-8" response.setContentType("text/html;charset=utf-8")。<br />返回给浏览器指示编码
    pageEncoding="UTF-8" 该.jsp文件的编码
    import="java.io.FileOutputStream" 引入第三方包
    extends="" 指定jsp继承的Servlet类
    session="true\false" 是否创建session
    autoFlush="true\false" 指定out对象的缓冲区是否自动刷新
    buffer="8kb" 指定out对象的缓冲区大小
    errorPage="xx.jsp" 此jsp执行出错时跳转的错误页面
    **isErrorPage="true\false" ** 此jsp是否是错误页面

    自定义错误页面

    // error.jsp
    <% @ page isErrorPage="true" %>
    
    <%
        //TODO 使用log4j来记录错误日志
        exception.printStackTrace();
    %>
    
    // index.jsp
    <% @ page errorPage="error.jsp" %>
    
    全局配置:
    // web.xml
    <web-app>
        // 可以写多个 error-page 标签,但一般使用一个来处理所有5xx异常
        <error-page>
            <exception-type>java.lang.Throwable</exception-type>
            <location>/error.jsp</location>
        </error-page>
        
        //根据HTTP状态码处理错误(一般针对404)
        <error-page>
            <error-code>404</error-code>
            <location>/404.html</location>
        </error-page>
    </web-app>
    

    简例

    public class XXServlet extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throw ServletException, IOException
        {
            // ...
            // 在服务器内部传递数据到jsp
            req.setAttribute("persons", list);
            req.getRequestDispatcher("/xx.jsp").forward(req, resp);
    
            // ...
            // 302重定向
            resp.sendRedirect("url");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throw ServletException, IOException
        {
            //...
        }
    }
    
    <body>
        <%=request.getAttributes("msg") %>
    
        <%
            List<Person> persons = (List<Persons>)request.getAttribute("persons");
            for (Person person : persons)
            {
        %>
                // <tr><td><%=person.getId() %><td></tr>
        <%
            }
        %>
    </body>
    

    下一节 JSTL

    简化jsp编写,大项目编码更友好

    相关文章

      网友评论

          本文标题:JSP(JavaServer Pages)

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