Servlet和JSP

来源:互联网 发布:国产数据库排名 编辑:程序博客网 时间:2024/06/05 00:16

一.servlet概念
Servlet是运行在服务器端的小程序,它定义了一个Java类能被浏览器所访问的规则(其实就是一个接口),它的作用就是用来接收请求,处理请求,响应请求。
Servlet是由服务器创建,管理,销毁。
二.Servlet快速入门:
1.创建Web项目
2.定义Java类 实现Servlet接口 重写里面的业务方法
3.在web.xml里面进行配置

mydemo 给Servlet配一个别名
org.westos.servletdemo.MyServlet 配置Servlet全类名

// 配置一个映射
mydemo
/demo// 配置一个虚拟路径用来作为浏览器要访问的资源路径

4.在service() 方法里面写个逻辑
5.发布项目
6.请求Servlet
三.生命周期
一) Servlet 生命周期:被创建时调用 init()——对外提供服务调用service()—–Servlet销毁时调用destroy()
1. init() 当Servlet被创建时调用, 而且只调用一次 ,用于初始化。
但是初始化,应该放在服务开启的时候就去初始化,通web.xml配置 0,默认值是-1 是在第一次请求时才去调用init()方法,如果是非负整数 服务器开启时就会调用 init()方法且数字越小,优先级越高。
2.service() 核心方法 对外提供服务 每一次请求会调用该方法处理请求,做出响应。
3.destroy()当Servlet被销毁时调用 ,当服务器正常关闭时,在销毁Servlet之前,会调用destory()方法。
4.getServletConfig()获取配对象的方法。
配置对象的作用:
1)获取web.xml 中配置的初始化参数
// config.getInitParameter(“”);
2)获取全局域对象:
// ServletContext 全局上下文对象,其实一个域对象是一个接口 它的子类对象由服务器创建,若要获取ServletContext 对象,要通过配置对象获取出来。
域:即范围 ServletContext是 全局域对象, 统管整个服务器资源
ServletContext 作用1:在域中的资源间共享数据
作用2:用来获取服务器的真实路径
java四个域对象:
// 1.ServletContext 全局域对象 统管整个服务器资源,域对象的作用,在一定范围内可以共享数据
// 2.session:会话域 可以包含多次请求和多次响应,并且可以在多次请求和多次响应间共享数据
// 3.request:请求域 在一次请求间共享数据
// 4.pageContext:页面域 在一个页面间共享数据
4个域对象 会有下面三个方法
// setAttribute(“num”, “100”);//在域中存储数据
// getAttribute(“num”);//取出域中的数据
// removeAttribute(“num”);//清除域中的数据
3)获取Web.xml 配置的Servlet的名字 config.getServletName()
5. getServletInfo() 获取 Servlet版本信息 作者等信息 一般不用
二)servlet的创建
a. 创建方式:
1. 实现Servlet
2. 继承GenericServlet
1.适配器
2.对ServletConfig进行优化。提升config对象的作用域
3.实现了ServletConfig接口,简化对config对象的使用方式
3. 继承HttpServlet:对http协议的封装, 重写doGet()和doPost()…方法 (注意去掉super.doGet(); 和 super.doPost()) 。
b. 自动创建Servlet
修改模板:
1 D:\MyEclipse\Common\plugins
2 搜索wizards
3.找到.jar 修改templemnts/Servlet.java

四.请求与响应
浏览器往服务器发送即请求request;服务器往浏览器回写即响应response,request 和response 对象都是由服务器创建,管理,销毁。
1. 请求:(request)
组成部分:请求行 请求头 请求体
请求行:请求信息的第一行
格式:请求方式 访问的资源 协议/版本;例如:GET /day0801/1.html HTTP/1.1
请求方式:get和post
get和post的区别:
get会把参数放在url的后面 post不会;
get参数大小有限制,post请求却没有限制;
get请求没有请求体;post请求有请求体,请求参数放在请求体中。
请求头:请求信息的第二行到空行结束
格式:key/value (value可以是多个值)
常见的请求头:
Accept: text/html,image/bmp –支持数据类型 text/html text/css text/javascript 大类型/小类型 mime类型
Accept-Charset: ISO-8859-1 –字符集
Accept-Encoding: gzip –支持压缩
Accept-Language:zh-cn –语言环境
Host: www.click369.cn:80 –访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT –缓存文件的最后修改时间
Referer: http://www.click369.com/index.jsp –来自哪个页面、防盗链
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection:Keep-Alive –链接状态
2.响应:(response)
组成部分:响应行 响应头 响应体
响应行:响应信息的第一行
格式:协议/版本 状态码 状态码说明
例如:HTTP/1.1 200 OK
状态码:
200 正常响应成功
302 重定向重定向,重定向特点:两次请求,两次响应;地址栏发生变化;不仅可以访问内部资源,也可访问外部资源
304 读缓存
404 用户操作资源不存在
500 服务器内部异常
响应头:从响应信息的第二行到空行结束
格式:key/value(value可以是多个值)
常见的头
Location: http://www.it315.org/index.jsp –跳转方向 和302一起使用的
Server:apache tomcat –服务器型号
Content-Encoding: gzip –数据压缩
Content-Length: 80 –数据长度
Content-Language: zh-cn –语言环境
Content-Type: text/html; charset=GB2312 –数据类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT –最后修改时间
Refresh: 1;url=http://www.it315.org –定时刷新
Content-Disposition: attachment; filename=aaa.zip –下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 –缓存
Cache-Control: no-cache –缓存
Pragma: no-cache –缓存
Connection: Keep-Alive –连接
五.request 对象和response对象
一) request 对象: 获取请求消息
1.获取请求行: GET /MyServlet/index.jsp?name=zhangsan&age=23 HTTP/1.1
request.getMethod();//获取请求方式
request.getContextPath();//获取项目名称
request.getRequestURI();//获取URI
request.getRequestURL();//获取URL
request.getRemoteAddr();//获取IP地址
request.getQueryString();//获取请求参数
request.getProtocol();//获取协议版本
2.获取请求头:
request.getHeader(“user-agent”);//获取请求头的值
request.getDateHeader(name);//获取日期头
request.getIntHeader(name)//获取数字头
3.获取请求体: 请求体:专门用于封装Post请求的请求参数
获取字符数据: getReader(); 返回一个高效的字符流,通过一次读取一行的 方法来获取请求参数数据 ,然后拆分字符串获取我们想要的数据
获取字节数据:getInputStream();
4. 通用的方式来获取 请求参数
request.getParameter(name); 通过请求参数的名称来获取值
request.getParameterValues(“hobby”); 通过请求参数的名称,来获取值的数组 一般用于复选框
request.getParameterMap(); 获取所有参数的map集合
request.getParameterNames(); 获取所有参数的名称 枚举 不常用 了解
5. 处理中文乱码问题
//通用处理方式:处理get post 请求提交中文数据乱码问题
String username = request.getParameter(“username”);
byte[] bytes = username.getBytes(“ISO-8859-1”);//将字符串还原成字节 相当于解码
username=new String(bytes,”utf-8”);//将字节重新编码
post 请求特有的方式 处理中文乱码
request.setCharacterEncoding(“utf-8”);
6.请求转发:
转发的特点:
1.一次请求一次响应
2.地址栏不发生变化
3.只能访问内部站点资源
7.域对象: 请求域的范围中共享数据
在一次请求的多个资源之间共享数据
request.setAttribute(“name”,”zhangsan”);
request.getAttribute(“name”);
request.removeAttribute(“name”);
注意: 什么时候使用重定向?什么时候使用转发?
1.如果需要在请求的多个资源中共享数据,则使用转发
2.如一次性的数据存入请求域中
8.路径的书写: 建议以/开头
服务器内部跳转路径 不需要加项目名称 如:request.getRequestDispatcher(“/myservlet2”).forward(request, response);
注意:页面上的路径和重定向需要加上项目名称如:
2)response:设置响应消息
setStatus(int code);设置响应状态码
重定向 302
特点:1.两次请求,两次响应
2.地址栏发生变化
3.不仅可以访问内部资源,也可访问外部资源
设置响应头: 例如:content-type:text/html;charset=utf-8
setHeader(String headName,String headValue); 设置响应头的名称和值
setDateHeader(String name,long date); 设置日期头
setIntHeader(String name,int count); 设置数字头
设置响应体:响应体响应的是数据, 要通过流的方式 获取输出流写出数据。
PrintWriter getWriter();发送字符数据的对象
// 为了防止乱码,要设置一下服务器对字符流的编码 默认服务器用的是ISO-8859-1
// 所以在获取流之前要告诉服务器用什么编码
response.setCharacterEncoding(“utf-8”);
//告诉浏览器我们用的是什么编码 ,好让浏览器用响应的编码去解码
response.setHeader(“content-type”,”text/html;charset=utf-8”);
//以上两个方法可以合二为一
response.setContentType(“text/html;charset=utf-8”);//作用:设置字符打印输出流的编码,并告诉浏览器用相应的编码去解码
ServletOutputStream getOutputStream(); 发送字节数据的对象
// 获取字节流 用流向浏览器写出一张图片
ServletOutputStream sos = response.getOutputStream();
// 获取图片的真实路径
String realPath = this.getServletContext().getRealPath(“/302.png”);
// 获取输入流读取图片
FileInputStream fis = new FileInputStream(new File(realPath));
byte[] by = new byte[1024];
int len = 0;
while ((len = fis.read(by)) != -1) {
sos.write(by, 0, len);
}
五.会话技术
会话技术是在一次会话中共享数据
1.概念:一次谈话,在web中指,浏览器和服务器的一次通信。包含多次请求,和多次响应,可以在一次会话的多次请求中共享数据。
2.客户端会话技术:Cookie:小甜点,小饼干, 数据存储在客户端。
1> 原理:
1).客户端请求一个资源,服务器做出响应时,会发送set-cookie头,共享数据
2).客户端接收到响应,会将数据保存在客户端浏览器中
3).客户端再一次请求服务器时,会通过cookie头携带该数据。
4).服务端接收到请求,会来解析获取数据
2> Java实现cookie:
发送Cookie:
//1.创建Cookie对象
Cookie c = new Cookie(“msg”,”hehe”);
//2.发送cookie
response.addCookie(c);
接收Cookie:
//1.获取所有的cookie
Cookie[] cs = request.getCookies();
//2.遍历
if(cs != null){
for(Cookie c : cs){
String name = c.getName();
if(“msg”.equals(name)){
String value = c.getValue();
}
}
}
案例:记住用户名和密码
3>Cookie持久化: Cookie默认存储在浏览器的内存中,浏览器一关内存一释放存的数据就没了,cookie 不跨浏览器; cookie 不支持存储中文数据;cookie 键和值 都是字符串类型的。
设置Cookie的存活时间,可以使其持久化
setMaxAge(int second);为正数:存在硬盘上,为负数:默认值-1 存在浏览器内存中,为 0:删除cookie
Cookie不支持中文:
解决方案:将Cookie数据转化为非中文数据存储
使用URL编码 解码
Cookie uc = new Cookie(“username”, URLEncoder.encode(username, “utf-8”));//编码
Cookie pc = new Cookie(“password”, URLEncoder.encode(password, “utf-8”));//编码
username = URLDecoder.decode(c.getValue(), “utf-8”);//解码
password = URLDecoder.decode(c.getValue(), “utf-8”);//解码
3. 服务器端会话技术:Session,主菜,它将数据存储在服务器端
原理:session依赖于cookie存在
1>Java实现Session:
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute(“msg”, “hehe”);
//3.获取数据
Object msg = session.getAttribute(“msg”);
2> session细节:
1.浏览器关闭了,session不一样了。
Cookie没了。jsessionid没了。
服务器关闭了,session一样吗?不一样。内存释放了。
优化:虽然对象不一样了,但是session中存储的数据还是一样的
钝化:服务器正常关闭后,session对象被写入硬盘的文件中
活化:服务器开启后,将文件还原为内存的session对象
2. session的生命周期
a. 创建:
request.getSession():
会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
b. 销毁: 服务器关闭
c.session超时

30

invalidate() :session自杀了。
3.如果客户端禁用了 cookie,session将不一样用URL重写解决
4.获取session:
getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
getSession(boolean flag):
true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
案例: 登录: 验证码
分析数据使用几次?一次request,转发; 一个用户多次 session,重定向;所有用户共享 ServletContext 重定向.
session 会话域 可以在多次请求和多次响应间共享数据, request 请求域 在一次请求和一次响应间共享数据
注: 选用那个合适?如果说是一次性数据 你就选request; 如果你要想数据在多个页面间使用 你只能选session; 如果你用了重定向跳转页面 那你共享的数据最好选用session 备选ServletContext; 如果你用请求转发跳转页面 你可以选request session 备选ServletContext。
4> JavaBean:符合特定规范的Java类
规范: 1.私有成员变量
2.提供公共的setter 和 getter
3.必须提供无参构造
4.实现序列化接口
javabean 用来封装参数:
1.分别获取各个表单项提交的参数
2.创建JavaBean
3.调用JavaBean的setter方法设置
BeanInfo:对JavaBean的描述对象。描述其字段和方法
PropertyDescriptor:字段描述对象
Introspector:获取Bean对象对应的BeanInfo对象
内省:对反射一层的封装,作用是用来找JavaBean里面的get, set。

六.JSP:
概念:Java Server Page是一种既可以写HTML 语言也可以写 Java代码的页面,是为了简化我们生成网页
JSP 本质是一个Servlet 在服务器work 目录可以查看 jsp转换后的java文件若想在JSP页面上写Java代码 可以用早期技术 jsp 脚本写。
<%! int num=100;%> 那生成的java代码在成员位置
<% int num2=60;%>生成的java代码在service()方法中
<%=”hello”%> 生成的代码在 serice()方法中 通过out.print(“hello”)
1.注释:
标记语言注释:
缺点:会发送到客户端;不能注释Java代码
jsp注释: <%– –%>
优点:不会发送到客户端;能注释Java代码
1)3大指令:
指令:配置JSP页面的属性或者导入一些额外的内容
格式:<%@ 指令名称 属性名=”属性值” %>
分类:page:配置JSP页面的属性
include:静态包含
taglib:导入额外的内容
a.page指令:
language :指定jsp页面使用的语言。只有一个值 java
import :导入软件包
pageEncoding :设置页面编码,指定jsp文件的编码;告诉浏览器页面使用的编码格式.
autoFlush:自动刷新
buffer:缓冲区大小
errorPage:指定错误页面,当页面发生异常时,指定跳转的页面, 一般在开发完成后,会在web.xml中通过标签来配置整个项目的错误页面.

500

/500.jsp


isErrorPage:是否是错误页面
true:是错误页面,可以使用内置对象exception
false:不是
taglib:导入额外的内容,如:导入jstl标签
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
include:静态包含, 包含后,只会存在一个.class文件。
2) 6个动作标签:
动作标签:替换Java代码,简化书写,提高可读性
Person p = new Person()//使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
p.setName(“zhangsan”)//设置JavaBean的属性值
String name = p.getName()// 取得JavaBean的属性值
动态包含
请求时文件包含多个.class字节码文件
转发
接受用户输入并将请求分派给另一页面
传递请求参数
内省:通过字段名称,找到对应的setter和getter方法。
–>





        <jsp:param  name="msg" value="hehe"/></jsp:forward>

3) 9个内置对象:
内置对象:在jsp转换后的.java文件的service方法中 声明好的对象,在jsp中可以直接使用。
分类:
application:ServletContext
session:HttpSession
request:HttpServletRequest
pageCotext:PageCotext (页面域)
out:JspWriter
response:HttpServletResponse
config:ServletConfig
page:this
exception: Throwable
a. pageCotext:
1.域对象:页面域
2.获取其他八个内置对象:可以在非jsp环境使用其他的内置对象。
b. out和response.getWriter():在使用对象向页面输出信息时,采用out