jsp
1、是什么
java server page
sun公司开发的一种服务器端动态页面生成技术,其主要组成部分是html元素以及少量的java代码。
因为直接使用servlet生成动态页面过于繁琐,使用jsp来生成动态页面更方便。
jsp文件以.jsp为后缀,不需要编译,直接打包,就可以运行。
2、jsp如何运行
当访问某个.jsp文件时,jsp引擎(理解为servlet容器中的某个特定模块)会将.jsp文件转换为.java文件(.java文件就是一个servlet),然后创建其实例并调用其service()方法。
3、jsp文件的组成
a,html元素(包括html标签、内容、css,javascript)
b,java代码
1)java代码片段
<% 任意的java代码 %>
2)jsp表达式
<%= %>
c,jsp隐含对象
在.jsp文件当中,不用声明和创建,就可以直接使用的对象。
out
request
response
d,指令
告诉jsp引擎,在将.jsp文件转换成.java文件时,做一些额外的处理
<%@指令名称 属性=值%>
比如:
<%@page import="java.util.*,java.text.*"%>
or
<%@page import="java.util.*"%>
<%@page import="java.text.*"%>
import属性:
告诉jsp引擎,在生成.java源文件时,import其他包
pageEncoding属性:
告诉jsp引擎,.jsp源文件保存的时候,所使用的编码
contentType属性:contentType="text/html;charset=utf-8"
作用通servlet.setContentType
4、.jsp文件如何转换成.java(也就是说如何转换成servlet)
a,<% %>里面的java代码---->直接放到service()方法
b,html----->在service方法里,使用out.write输出。//write(null)方法,会输出"";println(null)会输出null
一般情况下,如果结果输出到客户端,需要将null输出为“”
5、转发
(1)什么是转发?
在同一个应用内部,一个组件(一般是一个servlet将未完成的任务转交给另外一个组件来完成。
一般情况是:
一个servlet完成了业务逻辑的处理,将数据展现任务交给一个jsp来完成。
(2)编程
//绑定对象到request对象上
request.setAttribute(string name ,Object obj)
//如果绑定名对应的对象不存在,返回null
Object request.getAttibute(String name);
step1
RequestDispatcher rd=request.getRequestDispatcher("另外一个组件的地址");
step2
rd.forward(request,response);
(3)准发的特点:
a,一件事情未完成
b,转发的目的地,只能是同一个应用内部
c,转发时,浏览器地址栏的地址没有发生任何的变化
d,转发涉及的组件之间,可以共享一个request,response对象
转发要注意的问题:
在转发之前,不要有任何的输出,否则会出错。
如果转发之前,缓存当中有数据,会清空。
6、http状态管理
(1)为什么要对http协议进行状态管理。
因为http协议是一个无状态的协议,优点是,可利用有限的资源为多个客户服务。但是,对于一些特定的应用,比如
购物系统,需要记录客户端的状态,此时,需要对http协议进行状态的管理(了解)。
(2)如何实行状态的管理
a,在客户端保存用户的状态
即将用户的状态保存在浏览器端,即cookie技术。
b,在服务端保存用户的状态
即将用户的状态保存在服务器端,即session技术。
7、cookie技术
(1)什么是cookie
浏览器访问某个服务器时,服务器会创建一部分数据(以消息头set-cookie的方式)发送给浏览器,
浏览器会将这部分数据保存下来。当浏览器再次访问该服务器时,会将这部分数据发送给服务器。通过
这种方式,服务器可以维护用户的状态。
(2)cookie的使用
a,创建:
Cookie cookie=new Cookie(String name,String value);
response.addCookie(cookie);
b,cookie的生存时间
在默认情况下,cookie会保存在内存(浏览器所维护的一块内存空间)当中。
所以,当浏览器关闭,cookie会丢失。
如果要让cookie的生存时间
cookieName.setMaxAge(int seconds) seconds>0:即使浏览器关闭,cookie会以文件的方式保存在硬盘上。 seconds<0:默认(即保存在内存里) seconds=0:删除
c,编码问题
cookie的值只能是ASCII字符,所以对于中文,可以将其转换成ASCII字符的表示。
String name=URLEncoder.encode("张三","utf-8");//编码
String strName=URLDecoder.decode(name,"utf-8");//解码
d,查询
Cookie[] cookies=request.getCookies();
如果找不到任何cookie,返回null。
String cookie.getName();
String cookie.getValue();
f,路径问题
http://ip:port/appname/jsp01/jsp01.jsp当中,
有Cookie c=new Cookie();
在创建一个cookie时,都会有一个默认的path,该值是创建该cookie的组件的地址。此时,该path是/appname/jsp01
浏览器在访问服务器时,会比较要访问的地址addr1和cookie的path,只有path(/appname/jsp01)>=addr1(/appname/jsp01/sub/getCookie3.jsp),浏览器才会将cookie携带给服务器
可以使用cookie.setPath("")来修改cookie的path
cookie.setPath("/appname").
cookie.setPath("/"). 同一个服务器上部署的应用之间可以访问相互之间的cookie
如果设置了cookie域,浏览器会先比较要访问的地址的域名是否匹配,然后再比较path。
cookie.setDomain(".tarena.com.cn"); //一定要以点开头
(3)cookie的限制
a,cookie只能保存字符串,并且对于中文需要编码
b,cookie的大小有限制(4k左右)
c,cookie的个数也有限制(浏览器能够在本地保存的cookie的数量,大约300个(ie6))
d,cookie不是很安全
e,cookie可以被用户禁止
(4)cookie的使用场合
a,记录用户的使用习惯
b,网页换肤
c,自动登录
d,购物车(与session技术配合使用)
(5)路径问题
(1)一般需要考虑以下四种情况
a,链接<a href=""></a>
b,表单提交<form action="">
c,重定向 response.sendRedirect("");
d,转发 request.getRequestDispatcher("").forward();
(2)相对路径与绝对路径
a,相对路径:不以"/"开头的路径。
b,绝对路径:以"/"开头的路径,(1)的a,b,c三种情况,绝对路径从应用名开始,
而(1)d,绝对路径从应用名之后开始。
8、session机制
(1)什么是session
在服务器端维护用户状态的一种状态管理技术。浏览器访问服务器时,服务器会创建一个对象(session对象),
还会生成一个标示该对象的唯一的字符创(sessionId),服务器在默认情况下,会议cookie机制将sessionId发
送给浏览器。浏览器下次访问服务器时,会将sessionId携带给服务器,服务器会使用sessionId查找对应的session
对象。通过这种方式,来维护用户的状态。
(2)session的使用
a,创建session
方式一:HttpSession request.getSession();
方式二:HttpSession request.getSession(boolean flag);
flag为true:服务器查看请求中是否有sessionId,如果没有,则创建一个session对象,返回该对象的
的引用。如果有,要查看对应的session对象是否存在,如果存在,则返回该对象的引用,若不存在,则
创建一个session对象。
flag为false:服务器查看请求中是否有sessionId,如果没有,返回null。如果有,要查看对应的session
对象是否存在,如果存在,则返回该对象的引用,若不存在,返回null。
request.getSession()与request.getSession(true)等价。
b,常用方法
String session.getId();
//绑定某个对象
session.setAttribute(String name,object obj);
//找不到返回null
Object session.getAttribute(String name)
//设置最大不活动时间
session.setMaxInActiveInterval(int seconds)
c,设置默认超时限制
针对整个服务器或者某个特定的应用设置超时限制。
对于Tomact conf->web.xml-><session-config><session-timeout>30</session-timeout></session-config> 改完要重启服务器
对于某个特定的应用 WEB-INF\web.xml
(3)session验证
step1 登陆成功后,想session当中写入数据。
step2 在需要受保护的页面添加如下代码:
session.getAttribute(数据)
如果为空,说明用户登陆失败,不能访问,一般会重定向到登陆页面。
<%@include file="" %>:
jsp引擎在将.jsp文件转换成.java文件时,将对应的文件的内容插入到指令所在的位置。
9、验证码
(1)使用servelt生成图片
使用java.awt.*的相应类生成一个图像。
压缩图像成jpg格式
response.setContentType("image/jpeg")
使用outputStream out=response.getOutputStream()来输出。
(2)比较session中存放的checkcode与客户端传送回来的checkcode
10、用户禁止cookie,如何实现sessionId的跟踪(也就是说,还可以使用session机制)
可以使用URL重写机制来解决。
(1)什么是URL重写
所谓URL重写,指的是,通过修改修改URL地址,在其后添加sessionId,来实现sessionId的跟踪。
(2)URL重写注意事项
即在访问某个需要session机制支持的组件时,不要直接在浏览器地址栏输入地址,而应通过服务器生成的URL地址来访问。
(3)方法
a,response.encodeURL(url)
在链接、表单提交时,使用以上方法
b,response.encodeRedirectURL(url)
在重定向时使用
11、session机制的优缺点
相对于cookie机制,安全,存放的数据可以使对象,存放的数据量也更大。缺点是所有的数据都存放在服务器端,服务器
的压力比较大,一般会采用激活、钝化机制,将session当中的数据临时保存到文件或者数据库。
12、过滤器
(1)什么是过滤器
在servlet规范中定义的一种特殊的类,可以拦截服务器调用servlet的过程。
(2)编程
step1 写一个java类,实现Filter接口
step2 在doFilter()方法里,实现过滤的逻辑。
step3 在web.xml中配置过滤器。
可以使用FilterConfig.getInitParamenter()读取Filter的配置参数
(3)过滤器的优先级
在web.xml中,看<filter-mapping>配置,按该配置的先后顺序执行。
(4)过滤器的优点
a,可以将一些通用的功能(比如记录日志、权限控制、安全、编码设置等)集中编写在过滤器里面,这样做的好处是
编码量少了,并且易维护
b,代码的“可插拔性”
增加或者减少某个模块,不至于影响到整个系统的稳定性。
13、监听器
(1)是什么?
在servelt规范中定义的一种特殊的类,用于监听容器产生的一下事件:
a,当容器创建或者销毁HttpServletRequest,HttpSession,ServletContext(servlet上下文)时,产生的对应事件。
b,当对HttpServletRequest,HttpSession,ServeltContext调用setAttribute(),removeAttribute()时产生的事件。
(2)ServletContext:
当服务器启动时,会为每一个已经部署的应用,创建唯一的一个ServletContext对象。该对象会一直存在,除非
服务器关闭或者应用被卸载。
作用:
a,存放一些全局可用的数据。
即ServletContext.setAttribute(String name,Object obj)和
Object ServletContext.getAttribute(String name) 如果name对应的对象不存在,返回null
b,访问全局配置参数,即在web.xml中,使用<context-param>配置的参数。
c,返回逻辑路径所对应的实际的物理路径
ServletContext.getRealPath(逻辑路径);
如何获得其实例:
a,GenericServlet.getServletContext();
b,ServletConfig.getServletContext();
c,HttpSession.getServletContext();
(3)编程
step1 写一个类,依据要监听的事件类型,选择实现相应的接口。比如,要监听session的创建和销毁,可以实现
HttpSessionListener接口。
step2 在接口对应方法当中,实现监听的逻辑。
step3 在web.xml配置监听器
14、上传文件
step1 在<form method="post" enctype="multipart/form-data">
enctype的作用,是设置表单数据的MIME编码类型。
MIME(多功能的Internet邮件传输协议),在默认情况下,enctype="application/x-www-form-urlencoded"
如果要上传文件,必须将enctype设置成multipart/form-data,此时,浏览器会将文件直接以二进制数据流发送
给服务器。服务器不会将数据封装到request对象中。
step2 在服务器端,不能使用request.getParameter获得参数值,而应该使用
InputStream request.getInputStream()获得输入流,然后分析流。一般使用工具
(apache commons-fileuploader.jar)来分析。
15、servlet现成安全问题
(1)servlet为什么会有线程安全问题?
在默认情况下,容器只会为某个servlet维护一个实例,当多个请求到达容器时,有可能多个现成会访问同一个实例
(2)如何解决?
a,加锁
可以使用synchronized对方法或者代码块加锁。(会影响性能)
b,实现SingleThreadModel接口(标识接口,里面没有任何的方法)
public class SomeServlet extends HttpServlet implements SingleThreadModel
Servlet容器会为每一个请求创建对应的servlet实例。
不建议使用(因为会创建大量的servlet对象)。
c,在servlet类当中,尽量不对属性进行修改操作(建议)
16、中文问题
(1)表单的中文问题
(2)链接地址包含中文
浏览器会对链接地址中的中文(包含其他ascii字符以外的字符,比如日文,部分的拉丁字符等)进行编码,
统一采用utf-8编码。服务器默认情况下,采用iso-8859-1解码。此时,可以通过设置配置文件的方式,告诉
服务器采用指定的编码来解码。
tomcat_home/conf/server.xml
<Connector>中添加 URIEncoding="utf-8",作用是,服务器对于get请求,采用"utf-8"来解码。
(3)请求参数当中包含中文
请求参数当中包含中文,浏览器也会编码,
所使用编码与打开该页面时的编码一致。
方案一:保证页面打开时的编码与URIEncoding的设置一致
方案二:如果页面打开时的编码与URIEncoding的设置不一致,可以
<a href="xxx?name=<%=URLEncoder.encode("中文","编码")%>"></a>

浙公网安备 33010602011771号