servlet知识详解
来源:互联网 发布:怀化学院教育网络系统 编辑:程序博客网 时间:2024/05/29 03:10
基础概念 sun提供的用于开发动态web资源的技术
动态web资源的运用:
servlet的运行过程,周期:
我们可以用如下 图示来描绘servlet从接受请求到销毁的过程
servlet生命周期:从创建到死亡
servlet生命周期方法:准备条件:servlet创建 构造方法
1.servlet创建出来之后,需要调用init方法
2.servlet用于处理客户端请求,处理请求调用service方法
3.servlet死亡的时候需要调用destroy方法
servlet死亡:服务器关闭 该servlet所在的web应用被服务器移除掉
这些方法何时调用:
init()方法:第一次发送请求时,创建servlet对象并调用init方法 只调用一次
service()方法:每发送一次请求都调用一次 调用多次
destory()方法:服务器关闭 该servlet所在的web应用被服务器移除掉 只调用一次
HttpServlet类的方法比较:
service()不管发送的是什么请求(get/post)都会调用该方法。在该方法内默认会去判断你请求的类型,然后去调用对应的方法。
doGet()处理get请求。
doPost()处理post请求
servlet和jsp:
1.首先,jsp是servlet的一种特殊形式,jsp中的<% %> 相当于servlet代码
2. 简单地说 servlet是直接执行的文件,jsp是要被通过编译形成servlet后才执行。
jsp是servlet技术的扩展,servlet的应用逻辑在java文件中,并且完全从表示层的html中分类里分离出来
jsp是servlet和html组成的jsp文件,侧重于视图。serlvt侧重于控制逻辑。
结合实例具体介绍
第一个servlet程序:第一步:创建web应用,并且写好结构 WEB-INF classes
第二步:写一个servlet java程序
package com.qiyue.servlet;import javax.servlet.http.*;import javax.servlet.*;import java.io.*;public class FirstServlet extends HttpServlet{ protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{ resp.getOutputStream().write("helloworld".getBytes()); }}
将servlet-api.jar包添加到classpath环境变量中 set classpath=xxx
编译生成.class文件 javac -d . FirstServlet.java
第三步:写web.xml配置文件(参考conf/web.xml)
【由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,
必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
】
<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>f</servlet-name> <servlet-class>com.qiyue.servlet.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>f</servlet-name> <url-pattern>/First</url-pattern> </servlet-mapping></web-app>
第四部:启动运行:
http://localhost:8080/web应用名字/请求名
http://localhost:8080/first/First
http://localhost:8080/second/a.html:伪静态资源 实际上是某个servlet的url配置成了/a.html
http://localhost:8080/second/demo/a.html
一个servlet可以映射到多个url地址上去
注意:
同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。这两种格式不能混用
Servlet映射关系:
当地址栏中的地址能够匹配多个url地址时规则如下:
1.长得像的优先匹配
2.*开头的优先级低
标记接口:接口中没有方法
SingleThreadModel,Cloneable,Serializable
SingleThreadModel 标记接口:产生多个servlet对象,调用不同的对象,即一次请求创建一个servlet实例
规则:servlet尽量减少共享资源 session cookie
反思:Iterator :hasNext方法调用一次,next方法也只能调用一次
dopost 与doget方法的复写: dopost方法中写入信息,doGet方法调用doPost(req,resp)即可。
servlet的几大对象及方法:
servlet是服务端的组件,servlet运行在servlet容器中,比如tomcat,在收到客户端请求的时候,容器把请求信息封装为Request对象,并创建Response对象,传给servlet的service()方法,真正要实现的功能可以在service()调用java代码。
说到这些,就不能不提一下几个内建对象的作用范围。
Request和Response对象:
时间上再一次请求中,在这次请求中把Request中的信息传给别的资源,空间上只能是发送请求的客户端有效
ServletConfig
有效范围: 只作用于该servlet servlet配置信息中附带了一些初始化信息,通过该对象的得到 getServletConfig()
servletContext
作用域:作用于该web应用 web附带的一些初始化信息 通过该对象得到
如何得到 ServletContext对象:servlet.getServletContext()getServletConfig().getServletContext()
如何实现servlet之间的通信:servletContext.setAttribute() /getAttribute()/removeAttribute(ServletConfig:对象只在当前Servlet中有效
ServletContext:对象在web应用有效
在同一个web应用中传递信息
servlet得到资源文件:getRealPath() getResourceAsStream()
普通的java类得到资源文件:类名.class.getClassLoader().getResourceAsStream().....
实现web应用之间的通信:getContext("/xxx"); 有问题
Response:
主要方法:
getStatus 返回执行状态 addHeader(String header,null) 添加响应头
encodeUrl() 转发时遇到 sendRedirect 重定向 setStatus 设置状态码
**** add 与set区别: add永远是添加一个头,set如果没有则添加 如果有则替换
****导入超链接 :resp.getOutPutStream().write("<a href ='#'>click</a>".getBytes);
写入中文:resp.setHeader("content-type","text/html;charset=utf-8"); //告诉浏览器以utf-8打开页面
c.write("<a href ='#'>点击</a>".getBytes("utf-8")); //以utf-8对文字编码
解决乱码问题 :
1.输入时将码转换为浏览器默认的编码
String message = new String ("你好".getBytes("gbk"),"iso-8859-1");resp.getWrter().write(message);
2.前页形成 两头全部设置为指定的编码格式
resp.setCharacterEncording("utf-8");resp.setHeader("content-type","text/html;charSet = utf-8");resp.getWriter().writer("你好");
resp.getOutPutStream()和 resp.getWriter()只能选一种使用
Request:
主要方法:
getParameter name = a&password = 5getParameterNames names name =a&name=b
getParameterValue 返回相同名的值的集合
信息想要在后台获得需要的条件:
1.要提交的数据必须包含在form表单中
2.指定name属性,有的还要指定value属性(单选、复选、下啦、hidden)
request域对象:作用范围在当前请求中有效 ,在转发时遇到
getAttribute() 域有关,getAttribute 方法之前必须要先setAttribute
getParameter()读取form表单中的内容
注意:请求转发和使用流输送数据只能使用一个
resp.getwriter().write("adasd");resp.flushBuffer; req.getRequestDispatcher(”/index.jsp“)forward(req,resp); X
乱码问题:
默认浏览器是以gb2312的编码方式解析数据。网络上传输数据默认是iso-8859-1(latin)的方式发送数据。
下面列举 几种主要的编码方式:
iso-8859-1 gb2312 gbk utf-8 utf-16 ascii gb2312 gbk
解决方法:
response.getOutputStream()解决中文乱码问题:
告诉浏览器以什么编码解析数据
response.setHeader("content-type","text/html;charset=utf-8");
response.getWriter()解决中文乱码问题:
方式一:
控制response以什么编码方式发送数据
response.setCharacterEncoding("utf-8");
告诉浏览器以什么编码解析数据
response.setHeader("content-type","text/html;charset=utf-8");
方式二:
resp.setContentType("text/html;charset=utf-8");
重定向和转发的区别:
重定向:1.客户端发送了两次请求 2.地址栏发生变换 3.产生两个request和response对象转发:1.客户端只发送一次请求 2.地址栏不发生变化 3.产生一个request和response对象
用户登录成功,跳转到首页:重定向
尽量能用重定向就不要用转发
刷新
Service(){
Resp.setHeader(“refresh”,”3;url=http://www.baidu.com”);//3秒刷新一次 每次刷新都是重新发送一次请求 ,若要跳到其他网站,其后要接url网站地址
}
get、post: 默认所有方式都是get:
1.地址栏中直接输入
2.form表单提交
3.超链接
post:
form表单提交并且指定method=‘post’
form表单体检基本上都是用post
http请求格式:
请求行
多个请求头
空行
请求内容
get和post区别:
get:1.提交的数据信息显示在地址栏里面 2.数据内容是在请求行,提交的数据比较少
post:1.提交的数据信息不显示在地址栏里面 2.数据内容是在请求内容,提交的数据可以比较多
get和post乱码:
解决中文乱码问题:
post方式:req.setCharacterEncoding("utf-8");
get方式:String userName = new String(req.getParameter("userName").getBytes("iso-8859-1"),"utf-8");
MVC设计模式:Model View Controll
Model:模型 实体类 User类 javabean
view:视图 html jsp
controll: 控制层 用来连接视图和模型
控制层和视图层通信,控制层和模型层通信,但是视图层和模型层互不通信
域对象比较:
ServletContext域对象:作用范围:在web应用中有效
request域对象:作用范围: 在当前请求中有效
转发:
区分:
getAttribute():域有关 getAttribute方法之前必须要先setAttribute
getParameter():读取form表单中的内容
请求转发和使用流输送数据只能使用一个。
提交表单时,在servlet:
String username = req.getParmeter("username")//姓名
String []like = req.getParameterValues("like")//爱好
java.lang.IllegalStateException: Cannot forward after response has been committed
原因:在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。
路径问题:
首先路径/ 绝对路径
如果请求要发送给服务器,/ 相当于是WebRoot /a/d.html /index.jsp
如果发送给客户端: /相当于是web站点 /myrequest/a/d.html /mysquest/index.jsp
用路径的地方:
转发 路径不用包含web应用的名字
重定向:路径需要包含web应用的名字
form 路径需要包含web应用的名字
a 路径需要包含web应用的名字
servletcontext 路径不用包含web应用的名字
另一种方法:相对路径 相对于当前目录 (相对于webRoot) 不以/开头
难点:当前路径是什么
cookie技术:
Session存于服务器
每个sesssion都有一个固定的id,存于浏览器,结帐时通过id到服务器查找
由Cookie API 我们知道 javax.servlet.http.Cookie 类用于创建一个Cookie,
response接口中
定义了一个addCookie方法 在其响应头中增加一个相应的Set-Cookie头字段,
request接口中也定义了一个getCookies方法, 用于获取客户端提交的Cookie
具体实例:如图
Response:
主要方法:
- servlet知识详解
- J2EE知识扫肓--Servlet生命周期详解
- Servlet知识
- Servlet知识
- servlet知识
- Servlet知识
- Servlet知识
- servlet知识
- servlet知识
- Servlet知识
- Servlet知识
- 浅谈JavaWEB入门必备知识之Servlet入门案例详解
- Java Servlet 入门知识
- servlet知识收集
- servlet方面知识
- JSP+Servlet小知识
- Servlet相关知识
- servlet一些小知识
- su: warning: cannot change directory to /home/oracle: Permission denied
- VC6.0调试问题
- linux sysfs(4)
- session 设置登陆身份验证
- Qt UI Interfaces
- servlet知识详解
- 运用类模板实现不同类型的复数+,—,*,/
- 宏
- 反射应用
- 图形学中的贴图采样、走样与反走样等
- 从头学习开发Django系列-自定义标签和过滤器
- 黑马程序员——交通灯管理系统
- 角谷步数 你听说过角谷猜想吗? 任意的正整数,比如 5, 我们从它开始,如下规则计算: 如果是偶数,则除以2,如果是奇数,则乘以3再加1. 如此循环,最终必会得到“1” !
- 关于c和c++中的eof函数多读一个问题