您的位置:首页 > Web前端 > JavaScript

servlet、jsp小结

2014-02-27 22:51 183 查看
补充:

servlet类产生的实例对像都是单例的,所以在servlet类中定义的成员变量如 int i=0;如果在doGet()方法中有i++

当我们每访问一次servlet时这个就要加1;此时如果把i定义成局部变量,如在doGet(int i=0;++i)此时每次访问也是1.

jsp工作原理

翻译阶段先把jsp翻译成servlet类

在这过程中当容器接受到客户端第一次jsp页面请求时,他会判断这个jsp页面是否存在,若不存在则返回404错误,若存在则翻译成servlet。

编译阶段servlet类编译成.class文件

将翻译成的servlet源文件编译成一个字节码文件,然后由容器将其装载进虚拟机并实例化

执行阶段

调用翻译后的Servlet的对应的init()、service ()、destroy()

补充:

1) 如果被请求的jsp源文件内容发生变化,

那么要重新将jsp翻译成Servlet,再编译、

装载和实例化,最后运行Servlet。

2) 如果第二次请求jsp时,

此时若被请求的jsp已经有对应的Servlet实例,

那么就直接运行该Servlet。

<%! javacode%>会放在转化成的servlet类的成员方法或变量

<%javacode%>会放在转化成的servlet类的service()方法里面

<%=表达式%>会放在转化成的servlet类的service()方法里面,将表达式(expression)输出到out(输出流)中,

out.println(表达式);

对于servlet路径的补充

在myeclipse、eclipse中产生的web项目时,虽然在src下生成servlet类但部暑到服 务器上还是放在WebRoot下的WEB-INF下的classes文件夹下所以在找路径的时候整个项目的路径是

本来servlet类是在: 项目名\src\***.java下的

实际只要找**.class所以在

项目名\WEB-INF\classes\***.class下找,在这里我们会忽略WebRoot文件名

在doc下编译java文件

javac -d [生成的class文件存放位置] -cp [要引入的jar包信置] 要编译的 java文件所在位置。

对于编译jsp文件时有些几个标签得注意的

〈jsp: forword page="index.jsp"></jsp:forword>这对标签不要换行,否则编译会出错

〈jsp:include>标签也是这样的

三种注释的区别:

servlet源文件 客户端页面源文件 浏览器显示

HTML/XML注释 出现 出现不显示 <!-- -->

隐藏注释 不出现
不出现 不显示
<%-- --%>

脚本注释 出现
不出现 不显示
<% //javacode

/*javacode*/

%>

HTML/XML注释

功能:被注释的信息在服务器端的原文件和客户端的原文件都会出现,但是在浏览器中不显示这些注释信息。

隐藏注释

功能:被注释的信息不会翻译进servlet中,也不会在客户端的原文件中出现,浏览器也不会显示。注意:这种注释可以注释任何内容。

脚本注释

功能:被翻译进servlet中,在服务器端可以看见,但是在客户端的原文件看不见,浏览器中也不会显示

语法:<%@page attribute="value"...%>

通过声明的属性可以和容器进行通信,这些属性会对整个jsp产生影响

2)、include

语法:<%@include file="url" %>

称为静态包含(静态导入)

在这种方式下,当将jsp翻译成servlet的时候会把file指定资源的内容直接嵌入到_jspService()方法,所以它工作在翻译阶段。

可以导入的资源:html、jsp、xml等

优点:执行效率高

缺点:当将file指定的内容嵌入到_jspService()中后,内容就不好改变了,如果要改变被导入文件的内容,那么当前的jsp必须重新编译。

动态导入(动态包含)

语法1:<jsp:include page="url" flush="true"/>

语法2: <jsp:include page="url" flush="true">

<jsp:param name="n1" value="v1"/>

<jsp:param name="n2" value="v2"/>

</jsp:include>

动态导入在servlet的运行阶段被执行,被导入的内容可以是静态的(html)或者动态的。

所谓动态就是可以传递一些参数给被导入得jsp,然后动态生成一个html嵌入到调用的jsp页面中,再将信息返回给客户端。

设置flush为true,就是说,如果你的缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误。

<jsp:forward>(jsp实现web内跳转)

语法1:<jsp:forward page="url"/>

语法2:<jsp:forward page="url">

<jsp:param name="n1" value="v1"/>

</jsp:forward>

sendRedirect:(外部跳转)

forward和sendredirect的区别

Sendredirect
Forward

是不同的request
虽然是不同的对象,但是,可以取到上一个页面的内容

send后的语句会继续执行,除非return forward后的语句不会继续发送给客户端

速度慢 速度快

需要到客户端的往返,可以转到任何页面, 服务器内部转换,

地址栏有变化
地址栏没有变化

可以传参数,直接写在url后面 可以传参数

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

pageEncoding="UTF-8"%>

jsp---->servlet 采用pageEncoding="UTF-8";

servlet--->.class不受我们控制由虚拟机决定,默认UTF-8;

.class-->html页面采用charset=UTF-8

对于这行只是html的一个书写标准可以不要<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

contentType="text/html;charset="UTF-8"

定义页面显示的MIME类型和jsp页面的编码

pageEncoding="type"

定义jsp页面的字符编码,跟charset实现的功能一致

lpageEncoding是jsp文件本身的编码,把jsp文件编译成java的时候给编译器用的。

lcontentType的charset是指服务器发送给客户端时的内容编码,是浏览器解析网页的时候用的

l如果两个任意设置了其中一个,另一个即会与此保持一致。但,contentType除可以设置charset外,还可以设置MIME类型,如text/html

在servlet中

response.setContentType("text/html;charset=UTF-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进解码;

response.setCharacterEncoding("UTF-8"); 的目的是用于response.getWriter()输出的字符流的乱码问题,如果是response.getOutputStream()是不需要此种解决方案的;因为这句话的意思是为了将response对象中的数据以UTF-8解码后发向浏览器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: