servlet、jsp小结

补充:

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实现的功能一致

l pageEncoding jsp 文件本身的编码 , jsp 文件编译成 java 的时候给编译器用的。
l contentType 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解码后发向浏览器





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值