动态页面技术JSP讲解
动态页面技术JSP
1.jsp:java server page.它的根本就是简化servlet设计。在传统html页面嵌入java代码。
2.Tomcat内部维护着关于Servlet,request,HttpJspBase等的源码,所以关联以上源码时关联Tomcate源码即可。apache-tomcat-7.0.52-src.zip
3..jsp文件在tomcat中会被翻译成.servlet文件,它本质就是servlet。
它被放在work目录下。
被翻译过后的是这样的:
Index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.....JspSourceDependent{ }
4.Jsp脚本:主要学它翻译后的代码主要在哪!
1)<% java代码 %>--此java代码会被翻译到servlet的service方法内部
2)<%!=java 变量或表达式%>--会被翻译成service方法内部的out.print()直接输出。
3) <%! Java代码%>----会被翻译成servlet的成员位置
5.Jsp注释:不同的注释可见范围不同
1)html注释:<!--注释内容--> 可见范围:jsp源码-翻译后的servlet-页面显示的html源码
2)java 注释:单行和多行 可见范围:jsp源码-翻译后的servlet
3)jsp注释:<% 注释内容 %> 可见范围:只存在jsp源码中 最安全
6.jsp运行原理:本质是servlet
Jsp在第一次被访问时会被Web容器翻译成servlet
当访问xxx.jsp 时会匹配这个Url-pattern,
<url-pattern>*.jsp</url-pattern>
然后找到这个:<servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>最终该servlet会去work找jsp翻译后的servlet文件,如果没有则创建一个。
7.JSP的指令 是指导jsp翻译和运行的命令
Page指令:-属性最多的指令(实际开发中page指令默认)
它是属性最多的一个指令,根据不同的属性,指导整个页面的特性;
格式:
常见属性:language:java jsp脚本中可以嵌入的语言种类
pageEncoding:jsp文件的编码。可以认为pageEncoding内部维护着contentType所以开发中写一个即可!
contentType:text/html;charset=UTF-8;翻译后:response.setContentType(“text/html;chartSet=UTF-8”);
session:是否在jsp翻译时自动创建session,默认true。可在该页面直接使用session.setAttribute(“name”,”value”);
extends:servlet不能随便继承,所以这个属性一班不用。
Import:导包,两种写法,自己写和自动写。
errorPage:当前页面出现错误后跳转到指定页面。该指定页面可配置属性:isErrorPage=true 指该页面为错误页面;而这个方式不能处理404错误。
扩展:可在web.xml设置全局的错误页面:当jsp页面配置了error属性,将会采用就近原则!
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
一个jsp页面可以有多个<%@page 属性: %>
属性学完了,但是这些属性很少使用,相对而言使用多的是import属性,错误的页面跳转也很少使用!
Include指令:
页面包含(静态包含)指令,jsp的嵌套
<%@include file=”jsp地址“ %>
Taglib指令:在jsp中引入标签库(jstl标签库、struts2标签库)
<%@ taglib uri=”标签库地址” prefix=”前缀” %>
一般第一个指令很少用,默认就ok,只要使用第二三个指令。
8.九大内置/隐士对象
主要理解out对象:类型jspWriter 它就是用来给客户端写数据的
现有这么几种向客户端输入内荣方式:
aaa
out.writer(‘”bbb”)
response.getWriter().writer(“ccc”);
<%=ddd%> 要知道jsp默认buffer=”8kb”这个属性,除了第三个方法其他都是向out缓冲区写入数据后被刷新至response缓冲区,tomcat会从response拿数据,所以顺序为:c-abd ,如果设置缓冲区buffer=”0“代表关闭out缓冲区,直接写入response缓存区。输出:abcd。
PageContext对象(域):页面的上下文对象、Page对象指当前页面对象于此不同。
pageContext域除了基本的方法外,还有向其他域存取数据的功能
PageContext.setAttribute(name,value,xxx);
xxx-----PageContext.RWQUEST_SCORE或PageContext.SESSION_SCORE或APPLICATION_SCORE
pageContext.findAttribute(“name”);只要找到了就不找了!会从小到大域的范围搜索name。
域的大小:page域<request域<session域<application域
setAttribute(name,value);同名会覆盖前面的!
pageContext对象作用其二:可以获得其他八大对象。它内部维护者其他八大对象的索引。写框架用开发很少用(了解)。例:getRequest()
getContext();.........
Out(Jspwriter),request(HttpServletRequest),response(HttpServletResponse),application(ServletContext),page(this),exception,pagecontext页面容器,config(ServletConfig),ssession(HttpSession)
9.四大作用域总结:pageContext,request,session,servletContext(整个web应用)
10.jsp标签(动作)
动态包含:
静态包含和动态包含的区别:<%@ include file=””%> <jsp:include page=””/> 。静态包含是两个jsp文件被翻译成一个java文件。动态包含是包含文件先被翻译成java文件-再编译-后运行,运行时发现有一个方法:include(request,response,......);执行这个方法,就把被包含的页面翻译-编译-运行。。。。。。
请求转发:<jsp:forward page=”相对路径“/>
11.案例:完成商品的列表的展示,总结:
1)访问servlet,通过此查询数据库拿到数据(图片地址)
2)将数据封装到JB对象中,拿到JB对象的List集合,使用转发技术转发list到jsp页面。
3)Js页面拿数据时需要强转List<JB>
4)遍历集合将应拿的数据拿出来
5)注意:out()内部代码的拼接!!!!
Js代码: <%@page import="java.util.List" %> <%@page import="jsp.JB" %> <% List<JB> list =(List<JB>)request.getAttribute("name"); if(list!=null){ for(JB l:list){ out.write("<p class='col-md-2'>"); out.write("<a href='product_info.htm'> <img src="+l.getPimage()+" "); //out.write("<img src='"+l.getPimage()+"' width='170' height='170' style='display: inline-block;'>"); out.write("width='170' height='170' style='display: inline-block;''>"); out.write("</a>"); out.write("<p>"); out.write("<a href='product_info.html' style='color: green'>"+l.getPname()+"</a>"); out.write("</p>"); out.write("<p>"); out.write("<font color='#FF0000'>商城价:¥"+l.getMarket_price()+"</font>"); out.write("</p>"); out.write("</p>"); } } %> Servlet代码: DataSource cpds = new ComboPooledDataSource(); QueryRunner qr=new QueryRunner(cpds); String sql="select * from product"; try { List<JB> list = qr.query(sql, new BeanListHandler<JB>(JB.class)); System.out.println(list); request.setAttribute("name", list); RequestDispatcher rd = request.getRequestDispatcher("product_list.jsp"); rd.forward(request, response); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JB对象: private String pid; private String pname; private String market_price; private String shop_price; private String pimage; private String pdate;
上一篇: Elasticsearch索引(index)、映射(mapping)等相关的创建
下一篇: 见鬼了