jsp用法和代码例子,和解析跳转的过程

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

jsp:

生命周期 :

1 先执行当前类的构造方法

2 再执行init()方法

3 执行service()/doGet()方法

4 关闭的时候执行destroy()方法

jsp 是javaServletPage的缩写

jsp 的本质,是一个Servlet,是个特殊的java文件

Servlet : 平常的.java类,继承于HttpServlet类,且,必须覆写它的service()或doGet()方法

jsp 是在html中写java语句

jsp 在tomcat运行时的解析过程 :

**.jsp ---> tomcat 解析掉**.jsp中的<% %>,<%@ %>,<%= %>,<%! %>,并生成java(servlet)文件 --- > **.java ---> javac编译,生成**.class ---> **.class --->加载到jvm虚拟机,解析出一个虚拟的html表---->浏览器显示虚拟的html表--->当我们提交的时候,是在浏览器去找的,加载到jvm虚拟机里面的**.class(servlet文件)--->再执行操作

四种形式 :

<% %> , <%! %> , <%@ %> , <%= %>

1 <% %> : //里面可以写任意Java代码 就是doGet()方法 或Service()方法(一样这两个方法) (java代码要加";"分号,因为是方法体,该怎么写还怎么写)

里面的内容就是在写doGet()方法的方法体

intaccessCount=0;//就是局部变量

2 <%! %> : //类构成元素

// 这里声明的变量是成员变量

// 声明的方法是成员方法

// 相当于servlet类里面的类构成元素

// 成员变量 , 多个客户端访问同一份 每个线程都有一个成员变量的缓存 然后这个缓存 会定期和主线程同步

// 所以说 尽量不要使用成员变量!!!!

int accessCount=0;//成员变量

3 <%@ %> : //用来导包和设置编码格式

如 :

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

4 <%= %> : //用来直接输出,就是out.PRintln();

里面的内容就是out.println("内容")要输出内容的字符串,(所以不用加分号---";")

<%= request.getParameter("name")%>

↓↓↓↓↓↓

<% out.println( request.getParameter("name") ); %>

Servlet :

Servlet 是 在java中写html语句

include_file : //静态包含

静态包含 : jsp编译器编译的时候,已经包含好了相应的文件 并且只生成一个java(servlet)文件 -- javac 同一个class文件 在jvm运行的时候 他两个之间就不能传参了,他们使用同一个request,reponse(相当于把两个文件合并为一个文件)

<%@ include file="文件名.jsp"%>;//在哪里静态包含,就把指定文件合并到哪里(位置)

errorPage : //网页错误/跳转文件/跳转网页

错误网页 : 当当前文件出错的时候,跳转到指定文件中,但是指定文件的设置(编码...),必须和当前文件一致,而且必须指明,那就是指定文件

如 : <%@ page errorPage="文件.jsp"%>//错误网页

被包含文件(被指定文件) :<%@ page isErrorPage="true"%>//指明,我就是指定文件(要跳转到的文件)IUserService

include_page : //动态加载

注意: 1 jsp标签需要自己闭合

2 jsp:include 是动态加载! 在jsp编译的时候 加载页面和被加载页面 会被解析成两个java(servlet)文件!

3 javac 编译器会编译两次 生成两个class文件

然后在jvm虚拟机中运行的过程中,这个时候包含甲文件才回去调用乙class文件

这就是动态加载

4 他们不是同一个request对象了!!!!!!!

5 肯定需要flush

6 传值问题

如 :

<jsp:include page="_02_date.jsp" flush="true" />//动态加载

<jsp:param value="<%=value1 %>" name="v1"/>//传参

sendRedirect :

跳转

//使用答应(response)调用的,所以就已经出了jvm虚拟机,再过去指定页面 地址栏会改变

不会阻止下面的运行

就相当于在生成的那个java文件的doget()方法里面写了

response.sendRedirect("指定文件.jsp");//使用答应(response)调用的,所以就已经出了jvm虚拟机,再过去指定页面

因为他是在浏览器周转了一下 所以 浏览器会显示第二个页面的 地址

同样也说明了 他们肯定不是同一个对象

他们是不同的request对象

forward :

跳转

//使用请求(request)调用的,所以在jvm虚拟机里面,直接把指定页面拿过来,使用,地址栏不会改变,是动态加载概念

<jsp:forward/>

会阻止下面的运行

相当于在doget方法里面写了:

this.getServletConfig().getServletContext()----这里是通过当前servlet

获得了servlet配置属性 然后获得servlet上下文

.getRequestDispatcher(URL)-- 调用 分发器

传递到指定的URL路径去 forward方法才是真正的跳转

携带了当前的request response对象

.forward(request, response);

虽然他们的内存地址不一样 但是他们的对象里面的属性是相同的

他们两个页面之间的周转没有经过浏览器 一直在虚拟机里面

所以说他是比较快的

用法<forward>

<jsp:param 键值对>

这里相当于在原来的request对象基础上添加了键值对

</jsp:forward> --注意没有空格

useBean :

<jsp:useBean id="变量" class="文件名"></jsp:useBean>

//这里是获得Bean的对象的引用 就是new bean.CounterBean

<jsp:useBean id="cd" class="CounterBean"></jsp:useBean>

//实例化bean文件夹里面的CounterBean类文件,把对象引用赋值给 变量 cd

page :

//范围 page 是当前页面有效

<jsp:useBean id="变量" scope="page" class"文件名" />

<jsp:useBean id="conuterBean" scope="page" class"bean.CounterBean" />

request :

//范围 当前request对象有效

<jsp:useBean id="变量" scope="request" class"文件名" />

<jsp:useBean id="counterBean" scope="request" class="bean.CounterBean" />

application:

//范围 所有的访问,都能访问

<jsp:useBean id="变量" scope="application" class"文件名" />

<jsp:useBean id="counterBean" scope="application" class="bean.CounterBean" />

session:

//范围 当前浏览器

<jsp:useBean id="变量" scope="session" class"文件名" />

<jsp:useBean id="counterBean" scope="session" class="bean.CounterBean" />

setProperty :

<jsp:setProperty name="变量(以获取的对象引用)" property="属性(成员变量)" value="值(要设置的值)" />

//设置值

<jsp:setProperty name="cd" property="count" value="23" />

//给cd这个引用里面的count变量赋值为23 底层调用的setCount()方法(自己写的),用于让外界设置私有的成员属性的值

getProperty :

//获得值

<jsp:getProperty name="变量(以获取的对象引用)" property="属性(成员变量)" />

<jsp:getProperty name="cd" property="count" />

///获取cd这个引用里面的count变量的值, 底层调用的是getCount()方法(自己写的),用于让外界获取私有的成员属性的值

this_getServletConfig_getServletContext_getRequestDispatcher :

this.getServletConfig().getServletContext()

.getRequestDispatcher("/_12_Servlet_Jsp/_01_ServletUseJsp.jsp")

.forward(request, response);

//当前类对象(this),调用getServletConfig()先获得配置,在调用getServletContext()方法获得上下文,在调用getRequestDispatcher()分发器,分发到指定文件中,在把当前的request和response传入

getServletConfig :

this.getServletConfig();//获得配置属性

getServletContext :

this.getServletConfig().getServletContext();//获得上下文

getRequestDispatcher :

this.getServletConfig().getServletContext()

.getRequestDispatcher("/_12_Servlet_Jsp/_01_ServletUseJsp.jsp")

.forward(request, response);//分发器,分发到指定位置;

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航