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