[Javaweb 04] JSP原理分析 使用和javabean

JSP了解

Java Server Pages:java服务器端页面,用于动态web技术

早期没有jsp,前端需要在servlet中用out.print("<h1>123123</h1>");一行一行展示(jsp就是将这个步骤封装起来了)

jsp页面可以嵌入java代码,为用户提供动态数据


1. JSP原理

1. index.jsp文件分析

  1. 文件:和html一样,没有区别

  2. 服务器内部:tomcat中有一个work目录,可以发现jsp页面转换为了index_jsp.java文件

    IDEA的工作文件夹中找到Tomcat目录 ,也有work目录 IDEA的tomcat路径:用户/AppDate/JetBrains/tomcat/....

    所以JSP文件最后也会被转换为一个jave类, 继承了HttpJspBase类,这个类继承HttpServlet类

    所以JSP本质就是一个Servlet类

2. xxx_jsp.java分析:

.java文件中有:方法、内置对象、内置对象的赋值、打印前端页面的out.write()代码

  1. JSP的方法 :初始化,销毁,jspservice

    public void _jspInit(){}
    public void _jspDestroy(){}
    public void _jspService(req, resp){
        请求判断
        内置对象
        输出页面的代码
    }
    
  2. JSP的_jspService方法在java文件中的源码:

    1. 判断请求,

    2. 内置一些对象

      final javax.servlet.jsp.PageContext pageContext;//页面上下问
      javax.servlet.http.HttpSession session = null;//Session
      final javax.servlet.ServletContext application;//ApplicationContext
      final javax.servlet.ServletConfig config;//配置
      javax.servlet.jsp.JspWriter out = null;//输出的out对象,(jspWriter)
      final java.lang.Object page = this;//page:代表当前页
      req
      resp
      
    3. 输出页面前的代码:

      pageContext, application, config, session, out对象都可以直接使用!

      response.setContentType("text/html");//设置前端页面的展示方式
      pageContext = _jspxFactory.getPageContext(this, request, response,//这几个对象都可以直接使用!!!!!!
                                                null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      
      //界面输出代码:
      out.write("<h1>.....</h1>");
      ...
      
  3. JSP就是一种装饰器,用于把.jsp文件转换为.java文件,再返回给服务器中的tomcat,tomcat跑在JVM上。

XXX.js文件到XXX_jsp.java`文件时,

  1. java代码被原封不动的输出
  2. html代码被转换为out.write("

    ....")输出

2. JSP基本语法

1. jsp中写java程序:

1. 作用域都在_jspService()方法中

  • jsp表达式:

    <%--将程序结果输出到客户端 --%>
    <%= 变量或表达式%>
    <%=new java.util.Date()%>
    或者:
    ${=i}//EL,express language表达式
    
  • jsp脚本片段

    <%
    	代码片段;
    %>
    

    输出调用out.println("");

  • 嵌套:jsp界面直接理解为java文件,下面的代码输出4次hello

    所有的代码都在_jspService()方法中,输出

    <%
    for(i=1;i<5;i++)
    {  >%
        <h1> hello   <%=i%> </h1>
    <%
    }
    >%
    

2. 作用域在xxx_jsp.java的类中:

此时,生成的.java文件中,代码在类中,不在_jspService()方法中。

<%!中的代码称为JSP声明

<%! 
    static{
    System.out.println("static code");
}
private int age = 10;
    %>

3. 总结:

<%= 表达式/变量 %>
${= 变量}

<% java片段 %>

<%! 全局变量声明 %>

<!-- HTML的注释在前端页面(客户端)中显示 -->
<%-- JSP的注释在前端页面中不显示(客户端看不到) --%>

2. jsp指令集

1. 跳转到错误页面的方法:

  1. 在web.xml中配置标签:

    <error-page>
    	<error-code>404</error-code>
    	<location>${pageContext.request.contextPaht}/img/404.jsp</location>
    </error-page>
    
  2. 在jsp页面中用指令表示:

    <%@ page errorPage="${pageContext.request.contextPath}/img/404.jsp" %>
    

2. 其他指令:

导入包

<%@ page import=java.util.Date %>

其他设置:都在page的空格后面


在页面中添加公用的头部和尾部:

web目录通常放置如下:(common放置共同部分,error放置错误页面)

web工程目录说明:(一般情况,main中有三个文件:java, resource, web),这里web在外面

  1. include(在生成的java文件中,直接将header.jsp 和 footer.jsp 页面out.println()出来,

    所以命名空间为同一个,三个页面的代码中不能使用同样的变量名

    <%@ include file = "common/header.jsp" %>
    自己的页面主体
    <%@ include file = "common/footer.jsp" %>
    
  2. jsp标签(生成的java文件中,依然时引入两个页面,所以依然相当于三个页面

    分别有自己的命名空间

    <jsp:include page= "/common/header.jsp" />
    自己的页面主体
    <jsp:include page= "/common/footer.jsp" />
    

3. jsp 9大内置对象

jsp页面在转为.java文件时的9个内置对象:

  • pageContext, 传入的两个参数: req, resp
  • Session
  • Application就是 ServletContext
  • config, ServletConfig
  • out
  • page = this
  • Exception(之前没有看到的)

存东西的四个对象:

pageContext, req, Session , Application

//存东西进去
pageContext.setAttribute("name1", "名字1");//一个页面中有效
request.setAttribute("name2", "名字2");//一次请求中有效
session.setAttribute("name3", "名字3");//一次会话中有效
application.setAttribute("name4", "名字4");//从服务器打开到服务器关闭都有效
//取东西出来(可以使用pageContext都取出)
String name1 = (String) pageContext.findAttribute("name1");
String name5 = (String) pageContext.findAttribute("name5");

可以使用pageContext取出的原因: 四个对象的作用域不同

作用域从低到高为:

pageContext ---- request ----session ----application, 如果找不到,

${name1}: 没有的值不显示,

<%=name1%> : 显示为null, 所以多用EL表达式

转发页面:

pageContext.forward("/index.jsp");
//实际操作为:
req.getRequestDispatcy("/index.jsp").forward();

所以,转发后的页面可以取到request,session, application中的值

而如果没有页面转发,则新页面只能取到session和application的值!!!

3. JSP标签,JSTL标签,EL表达式

1. EL表达式

  1. 获取数据,2. 执行运算 3. 获取web开发的常用对象

文件中不能使用EL表达式的解决:

注意:不能使用EL表达式,则是因为web的版本太低,可能为1.0, 需要设置jsp文件头的版本为4.0(直接去复制tomcat中的)或者,在文件中添加<%@ page isELIgnored = "false" %>

2. JSP标签

<jsp:forward page="index.jsp">
    <jsp:param name="name1" value="value1"/>
</jsp:forward>

3. JSTL标签

JSTL标签是为了弥补html标签的不足;标签的功能和java代码一样。(可以用标签实现java代码)

使用必须引入头,只需要了解核心标签(去菜鸟教程学就可以)

eg: if的实现,<c:set 保存数据.

4. JavaBean

一个实体类(都是用来和数据库中的表结构一一对应的)

特点(必须):

  • 必须要有无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般用来和数据库的字段做映射(ORM,和注解与反射最后的一样)

<%
    //对应jsp标签所做的事情
	People people = new People();
	people.setName("myName");
	people.getAddress();
%>


<jsp:useBean id="people" class="com.roy.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="name" value="myName"/>
姓名:<jsp:getProperty name="people" property="name"/>
posted @ 2021-11-28 19:43  Roy2048  阅读(61)  评论(0)    收藏  举报