java中如何实现界面的跳转???

java中如何实现界面的跳转???,第1张

Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。 它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。

Servlet是一个接口,它的service方法是每当用户发出请求,就会被调用。但是接口中是没有具体实现的。

HttpServlet是Servlet的一个具体实现。HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类,该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 <FORM>和 </FORM>标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。

每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。

5.3.1 使用break 语句

在Java 中,break语句有3种作用。第一,你已经看到,在switch语句中,它被用来终止一个语句序列。第二,它能被用来退出一个循环。第三,它能作为一种“先进”的goto 语句来使用。下面对最后 2种用法进行解释。

使用break 退出循环

可以使用break 语句直接强行退出循环,忽略循环体中的任何其他语句和循环的条件测试。在循环中遇到break语句时,循环被终止,程序控制在循环后面的语句重新开始。下面是一个简单的例子:

// Using break to exit a loop.

class BreakLoop {

public static void main(String args[]) {

for(int i=0i<100i++) {

if(i == 10) break// terminate loop if i is 10

System.out.println("i: " + i)

}

System.out.println("Loop complete.")

}

}

该程序产生如下的输出:

i: 0

i: 1

i: 2

i: 3

i: 4

i: 5

i: 6

i: 7

i: 8

i: 9

Loop complete.

正如你看到的那样,尽管for 循环被设计为从 0执行到99,但是当i等于10时,break语句终止了程序。break语句能用于任何 Java 循环中,包括人们有意设置的无限循环。例如,将上一个程序用while 循环改写如下。该程序的输出和刚才看到的输出一样。

// Using break to exit a while loop.

class BreakLoop2 {

public static void main(String args[]) {

int i = 0

while(i <100) {

if(i == 10) break// terminate loop if i is 10

System.out.println("i: " + i)

i++

}

System.out.println("Loop complete.")

}

}

在一系列嵌套循环中使用break 语句时,它将仅仅终止最里面的循环。例如:

// Using break with nested loops.

class BreakLoop3 {

public static void main(String args[]) {

for(int i=0i<3i++) {

System.out.print("Pass " + i + ": ")

for(int j=0j<100j++) {

if(j == 10) break// terminate loop if j is 10

System.out.print(j + " ")

}

System.out.println()

}

System.out.println("Loops complete.")

}

}

该程序产生如下的输出:

Pass 0: 0 1 2 3 4 5 6 7 8 9

Pass 1: 0 1 2 3 4 5 6 7 8 9

Pass 2: 0 1 2 3 4 5 6 7 8 9

Loops complete.

从中可以看出,在内部循环中的break语句仅仅终止了该循环,外部的循环不受影响。

关于break ,在这里要记住两点。首先,一个循环中可以有一个以上的break 语句。但要小心,太多的break 语句会破坏你的代码结构。其次,switch语句中的break仅仅影响该switch 语句,而不会影响其中的任何循环。

注意:break 不是被设计来提供一种正常的循环终止的方法。循环的条件语句是专门用来终止循环的。只有在某类特殊的情况下,才用break 语句来取消一个循环。

把break 当作goto 的一种形式来用

break语句除了在switch语句和循环中使用之外,它还能作为goto 语句的一种“文明”形式来使用。Java 中没有 goto 语句,因为goto 语句提供了一种改变程序运行流程的非结构化方式。这通常使程序难以理解和难于维护。它也阻止了某些编译器的优化。但是,有些地方goto 语句对于构造流程控制是有用的而且是合法的。例如,从嵌套很深的循环中退出时, goto 语句就很有帮助。因此,Java 定义了break 语句的一种扩展形式来处理这种情况。通过使用这种形式的break,你可以终止一个或者几个代码块。这些代码块不必是一个循环或一个switch语句的一部分,它们可以是任何的块。而且,由于这种形式的break 语句带有标签,你可以明确指定执行从何处重新开始。你将看到,break带给你的是goto 的益处,并舍弃了goto 语句带来的麻烦。

标签break 语句的通用格式如下所示:

break label

这里,标签label 是标识代码块的标签。当这种形式的break执行时,控制被传递出指定的代码块。被加标签的代码块必须包围break 语句,但是它不需要是直接的包围break的块。这意味着你可以使用一个加标签的break 语句退出一系列的嵌套块。但是你不能使用break 语句将控制传递到不包含break 语句的代码块。

要指定一个代码块,在其开头加一个标签即可。标签(label )可以是任何合法有效的Java 标识符后跟一个冒号。一旦你给一个块加上标签后,你就可以使用这个标签作为break 语句的对象了。这样做会使执行在加标签的块的结尾重新开始。例如,下面的程序示例了 3 个嵌套块,每一个都有它自己的标签。break语句使执行向前跳,调过了定义为标签second 的代码块结尾,跳过了2个println ( ) 语句。

// Using break as a civilized form of goto.

class Break {

public static void main(String args[]) {

boolean t = true

first: {

second: {

third: {System.out.println("Before the break.")if(t) break second// break out of second blockSystem.out.println("This won't execute")

}

System.out.println("This won't execute")}System.out.println("This is after second block.")

}

}

}

运行该程序,产生如下的输出:

Before the break.

This is after second block.

标签break 语句的一个最普遍的用法是退出循环嵌套。例如,下面的程序中,外层的循环只执行了一次:

// Using break to exit from nested loops

class BreakLoop4 {

public static void main(String args[]) {

outer: for(int i=0i<3i++) {

System.out.print("Pass " + i + ": ")

for(int j=0j<100j++) {

if(j == 10) break outer// exit both loops

System.out.print(j + " ")

}

System.out.println("This will not print")

}

System.out.println("Loops complete.")

}

}

该程序产生如下的输出:

Pass 0: 0 1 2 3 4 5 6 7 8 9 Loops complete.

你可以看到,当内部循环退到外部循环时,两个循环都被终止了。记住如果一个标签不在包围break的块中定义,你就不能break 到该标签。例如,下面的程序就是非法的,且不会被编译:

// This program contains an error.

class BreakErr {

public static void main(String args[]) {

one: for(int i=0i<3i++) {

System.out.print("Pass " + i + ": ")

}

for(int j=0j<100j++) {

if(j == 10) break one// WRONG

System.out.print(j + " ")

}

}

}

因为标签为one的循环没有包围break 语句,所以不能将控制传递到该块。

5.3.2 使用continue 语句

有时强迫一个循环提早反复是有用的。也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句。实际上,goto 只不过是跳过循环体,到达循环的尾部。continue 语句是break语句的补充。在while 和do while 循环中,continue 语句使控制直接转移给控制循环的条件表达式,然后继续循环过程。在for 循环中,循环的反复表达式被求值,然后执行条件表达式,循环继续执行。对于这3种循环,任何中间的代码将被旁路。

下例使用continue 语句,使每行打印2个数字:

// Demonstrate continue.

class Continue {

public static void main(String args[]) {

for(int i=0i<10i++) {

System.out.print(i + " ")

if (i%2 == 0) continue

System.out.println("")

}

}

}

该程序使用%(模)运算符来检验变量i是否为偶数,如果是,循环继续执行而不输出一个新行。该程序的结果如下:

0 1

2 3

4 5

6 7

8 9

对于break语句,continue 可以指定一个标签来说明继续哪个包围的循环。下面的例子运用continue 语句来打印0到9的三角形乘法表:

// Using continue with a label.

class ContinueLabel {

public static void main(String args[]) {

outer: for (int i=0i<10i++) {

for(int j=0j<10j++) {

if(j >i) {

System.out.println()

continue outer}

System.out.print(" " + (i * j))}}

System.out.println()

}

}

在本例中的continue 语句终止了计数j的循环而继续计数i的下一次循环反复。该程序的输出如下:

0

0 1

0 2 4

0 3 6 9

0 4 8 12 16

0 5 10 15 20 25

0 6 12 18 24 30 36

0 7 14 21 28 35 42 49

0 8 16 24 32 40 48 56 64

0 9 18 27 36 45 54 63 72 81

很好的利用continue 语句的情况很少,一个原因是Java 提供了一系列丰富的循环语句,可以适用于绝大多数应用程序。但是,对于那些需要提早反复的特殊情形,continue 语句提供了一个结构化的方法来实现。

5.3.3 使用return语句

最后一个控制语句是return。return语句用来明确地从一个方法返回。也就是,return 语句使程序控制返回到调用它的方法。因此,将它分类为跳转语句。尽管对return 语句的详细讨论在第 7 章开始,这里对其作简要地介绍。

在一个方法的任何时间,return 语句可被用来使正在执行的分支程序返回到调用它的方法。下面的例子说明这一点。下例中,由于是Java 运行系统调用main() ,因此,return语句使程序执行返回到Java 运行系统。

// Demonstrate return.

class Return {

public static void main(String args[]) {

boolean t = true

System.out.println("Before the return.")

if(t) return// return to caller

System.out.println("This won't execute.")

}

}

该程序的结果如下:

Before the return.

正如你看到的一样,最后的println( ) 语句没有被执行。一旦return语句被执行,程序控制传递到它的调用者。

最后一点:在上面的程序中,if(t)语句是必要的。没有它,Java 编译器将标记“执行不到的代码”(unreachable code )错误,因为编译器知道最后的println ()语句将永远不会被执行。为阻止这个错误,为了这个例子能够执行,在这里使用if语句来“蒙骗”编译器。

客户端跳转:服务器端将请求结果返回给客户端,客户端向服务器发出另一次请求。在客户端跳转过程中是两次不同的请求。在地址栏中显示的是最后一次请求地址。

客户端跳转可以进行站外跳转。

1、链接跳转:<a href=””></a>

2、表单提交

3、Response.sendRedirect(“3.jsp”)

4、<mata http-equiv=”refresh”, content=”32.jsp”/>

5、response.setHeader(“refresh”,” 32.jsp”)

6、客户端跳转“/”代表服务器跟路径webapps

服务器端跳转(容器内跳转):能够自动的在服务器内部进行跳转,这种跳转对用户来说是透明的。两次跳转时同一个request,在地址栏中显示的事第一次页面地址。

只能进行站点内跳转。

1、<jsp:forward page=””/>

2、pageContext.forward()

3、 request.getRequestDispatcher("1.jsp").forward(request,response)

3、服务器端跳转“/”代表站点根路径

请求转发也就是服务器跳转,是服务器内部的 *** 作,浏览器不知道服务器内部发生了这个 *** 作,所以浏览器以为还是访问的是第一次请求的地址,因此地址栏不变,整个过程是在一个请求响应周期内。

请求重定向既客户端跳转,是在浏览器第一次发送请求后,服务器返回一个响应给浏览器,让浏览器去访问另一个地址,这样浏览器就知道了他该跳转了,所以他就去请求服务器返回给他的地址,他的地址栏就发生了变化,而这个过程是发生在两个请求响应周期里的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12199222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存