Servlet

javaSE
Java Applet ---- 运行在网页里面的java程序    类似今天flash
Java Application

服务器端 运行程序
进程和线程
进程应该是资源管理最小单位 内存分配给进程
线程的程序执行的最小单位

tomcat 申请了 100Mb内存
Servlet程序1 线程 从100Mb 申请

servlet入门
1、新建web project
2、新建servlet  -----> extends HttpServlet  修改 虚拟路径 /hello
3、覆盖 doGet doPost  ---- > Http请求 提交方式 get post
4、doGet(HttpServletRequest req, HttpServletResponse resp)
HttpServletRequest =-=== 请求
HttpServletResponse ---- 响应 --- 向客户端输出

编写Servlet步骤
继承 javax.servlet.http.HttpServlet
web.xml配置Servlet的虚拟路径
覆盖doGet、doPost

http://localhost:8080/firstservlet/hello
http://localhost:8080 本机tomcat
/firstservlet 工程虚拟路径(工程名) tomcat
/hello servlet虚拟路径

Servlet虚拟路径:为一个Servlet类 指定一个 路径
/hello  ----> cn.itcast.servlet.HelloServlet

Servlet生命周期 init service destroy
可能有多少次请求? 不确定
在servlet被正式访问之前(在任何请求被处理之前)
init()方法只在Servlet第一次被请求加载的时候被调用一次 ----- > 在所有请求之前 init 被执行一次
service 方法 每接收一个请求 调用一次
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象

destroy 方法 当容器退出时调用 -----> shutdown


Servlet容器:服务器端程序tomcat ---> Servlet容器 ---- > 管理,加载、调度Servlet

1、容器内写好了Servlet
2、A 提交了第一次请求  ,容器创建了Servlet对象(构造方法),容器调用了对象的init方法,新建一个线程 ---> 调用service
3、B 提交了一个请求,新建一个线程 ---> 调用service
init和构造方法有什么区别
为什么init方法的内容不写到构造方法里呢??
当你的构造方法有特别复杂的逻辑时,是不是会导致对象创建比较慢
Java里面:建议你将对象初始化的一些复杂逻辑代码写成单独的方法

信息:正常情况下 implements Servlet
init service destroy
当有请求时 ----> service
现在我们编写的Servlet extends HttpServlet
当有请求时 ----> doGet doPost
结论:service 调用了 doGet 和 doPost

配置 Servlet自动加载?
默认Servlet什么时候加载(创建对象 初始化) --- 第一次请求时
如果你想让Servlet随服务器启动加载
<load-on-startup>2</load-on-startup>  ---- 数字越小优先级越高 最高是0

GenericServlet新增了一个无参数init()方法,目的是,开发人员无需覆盖生命周期init(ServletConfig),只需覆盖无参数init
init(ServletConfi) 和 init() 关系: init(config) 调用了 init()

1、服务器端是不是所有资源都得通过URL获得
2、所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上
3、配置Servlet路径 <Servlet> <Servlet-mapping>
4、三种匹配方式
同一个Servlet可以被映射到多个URL上
第一种 完全路径匹配 例如:/hello ----- 必须以/ 开头
第二种 路径匹配 例如:/abc/* ---- 必须以/开头 表示abc路径下所有请求
第三种 扩展名匹配 例如 *.do ---- 不能以/开头 表示所有以.do结尾请求


http://localhost:8080/firstservlet/index.html ----- > 并不是直接访问index.jsp文件的 ----> 实际上需要执行一个Servlet
当你访问一个资源 路径找不到资源匹配的时候,会执行缺省Servlet
JSP ----> JSP 就是Servlet

ServletConfig 是一个配置对象,是Servlet容器用来在Servlet初始化阶段,传递信息给Servlet
对象来自 :init(ServletConfig)
补充:在开发中 继承HttpServlet  getServletConfig() 获得 ServletConfig对象

主流应用
获得字符集编码 ----- request response
设置编码:response.setContentType
获得数据库连接信息
获得配置文件


ServletConfig 和 Servlet 关系
一个Servlet对象  对应 一个私有的ServletConfig ---- 配置多个 init-param

ServletContext 是一个代表当前web应用的对象 ,一个web应用对应一个ServletContext对象
ServletContext对象 是通过ServletConfig.getServletContext()获得
ServletContext配置数据 --- 可以在任何一个Servlet获得

ServletContext实现数据共享
setAttribute 设置一个数据  getServletContext().setAttribute("info", info);
getAttribute 取得一个数据 getServletContext().getAttribute("info");
removeAttribute  删除一个数据

重定向和转发
张三:客户端
李四、王五:服务器端
1、重定向 张三找李四借钱(请求),李四不借,告诉张三找王五(响应),张三又去找了王五(请求),王五把钱给了张三(响应)
两次请求,两次响应
2、转发  张三找李四借钱(请求),李四去找了王五(转发),王五把钱给了张三(响应)
一次请求 一次响应

转发:服务器端资源内部调用

ServletContext.getRequestDispatcher("资源A路径").forward(request,response);
资源A 是一个Servlet --- 虚拟路径

读取文件:用字节流读,用字符流读,用字符流解码字节流读取
编码、解码
String char[] --- byte[]   String.getBytes(charset);
byte[] --- String   new String(byte[],charset);

读取文件前提:找到文件 FileSystem路径,classpath路径

src --- > java path
bin ----> classpath

编写web工程: 路径虚拟的

当你想使用文件系统路径读取文件 : 虚拟路径---> 真实路径 ServletContext.getRealPath
当你想使用classpath路径读取文件:需要得到ClassLoader 对象
Thread.currentThread().getContextClassLoader().getResource(“info.txt").getFile();

getRealPath -- ServletContext --- Servlet中使用

文件读取(读文件、写文件)
ResourceBundle.getBundle("cn/itcast/servlet/config").getString("name")  // 只能读,不能写
写文件:必须拿到文件对象
Properties类》????

web 工程中
绝对路径 以/ 开始
服务器端和客户端对于/ 的区别
假设有个工程 http://localhost:8080/url
服务器端 / -----> http://localhost:8080/url/
配置Servlet url-pattern : /link ----> http://localhost:8080/url/link

客户端 / -----> http://localhost:8080/
<a href="/link">link</a> ----> http://localhost:8080/link

 

相对路径
<a href="link">link</a>
下一个路径是什么:当前路径 http://localhost:8080/url/index.html
点击链接: http://localhost:8080/url/link

aaa/a,html
<a href="/servlet/link">绝对路径</a>   -----> http://localhost:8080/servlet/link 不行
<a href="/url/servlet/link">绝对路径</a>

**绝对路径 不管写在哪个html 不用修改


http://localhost:8080/url/servlet/link
相对路径
http://localhost:8080/url/aaa/a.html
<a href="../servlet/link">

getServletContext().getRequestDispatcher("/aaa/a.html").forward(req,resp);  ----- / 服务器
resp.setHeader("Location", "/url/aaa/a.html"); ----- / 客户端

第一次
当前:http://localhost:8080/url/index.html
目标:http://localhost:8080/url/servlet/link
相对<a herf="servlet/link">

第二次
当前路径:http://localhost:8080/url/servlet/link
相对<a herf="servlet/link">
http://localhost:8080/url/servlet/servlet/link ---- 404

 

posted on 2013-06-21 11:13  笨'小孩  阅读(319)  评论(0编辑  收藏  举报

导航