[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文件分析
-
文件:和html一样,没有区别
-
服务器内部: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()代码
-
JSP的方法 :初始化,销毁,jspservice
public void _jspInit(){} public void _jspDestroy(){} public void _jspService(req, resp){ 请求判断 内置对象 输出页面的代码 }
-
JSP的_jspService方法在java文件中的源码:
-
判断请求,
-
内置一些对象
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
-
输出页面前的代码:
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>"); ...
-
-
JSP就是一种装饰器,用于把.jsp文件转换为.java文件,再返回给服务器中的tomcat,tomcat跑在JVM上。
XXX.js文件到
XXX_jsp.java`文件时,
- java代码被原封不动的输出
- 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. 跳转到错误页面的方法:
-
在web.xml中配置标签:
<error-page> <error-code>404</error-code> <location>${pageContext.request.contextPaht}/img/404.jsp</location> </error-page>
-
在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在外面
-
include(在生成的java文件中,直接将header.jsp 和 footer.jsp 页面out.println()出来,
所以命名空间为同一个,三个页面的代码中不能使用同样的变量名
<%@ include file = "common/header.jsp" %> 自己的页面主体 <%@ include file = "common/footer.jsp" %>
-
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表达式
- 获取数据,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"/>