JavaWeb笔记-Servlet
JavaWeb笔记-Servlet
Servlet
1、eclipse下JavaWeb目录结构

- day08_00_servlet为JavaWeb项目子在eclipse中的根目录,根目录下的文件浏览器可以直接访问
- src目录下面放置的是java源代码
- src目录下的文件编译后的class字节码文件会自动保存到"WEB-INF/classes/"目录下面
- 当项目部署到服务器(例如:tomcat)后,网站的根目录相当于是WebRoot(这个名字根据实际情况取名)
- “WEB-INF/lib/”目录下放置的是引用的jar包
- web.xml为网站的配置文件 里面主要用来配置servlet映射关系
- 注意: " WEB-INF/"目录下的文件外部(也就是浏览器)不能直接访问,由web服务器(如:tomcat)负责调用
- 网站根目录"WebRoot"下的index.jsp 浏览器可以直接访问
2、浏览器访问Servlet的执行过程
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用 <servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径
web.xml
<!-- -->
<servlet>
<servlet-name>servletDemo1</servlet-name>
<servlet-class>com.it.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo1</servlet-name>
<url-pattern>/demo1</url-pattern>
<!--
url-pattern:路径说明:
"/"代表的是当前网站部署在服务器上的根目录,如果是在eclipse代表的就是"WebRoot/"
-->
</servlet-mapping>
- 访问过程
-
客户端发出请求http://localhost:8080/demo1
-
根据web.xml文件的配置,找到子元素的值“/demo1”的元素
读取元素的子元素的值"servletDemo1",由此确定Servlet的名字为”servletDemo1” -
找到值为"servletDemo1"的元素
读取元素的子元素的值"com.it.servlet.ServletDemo1",由此确定Servlet的类名为"com.it.servlet.ServletDemo1"。 -
到Tomcat安装目录/webapps/Demo1/WEB-INF/classes/com/it目录下查找到ServletDemo1.class文件
-
**注意:**http://localhost:8080/demo1,8080后面的第一个“/” 代表的就是完整在Tomcat服务器上的根目录/webapps/Demo1/
- 图解过程-参考传智播客视频

3、Servlet的生命周期
-
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
-
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
-
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
-
Servlet生命周期: 实例化 > 初始化 > 服务 > 销毁
-
Servlet生命周期函数: Servlet构造方法 > init(ServletConfig config) > service(ServletRequest req, ServletRespinse res) > destroy()
4、Servlet接口实现类
- GenericServlet
- HttpServlet (重要)
- HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
5、Servlet的线程安全
- 单实例: 每次访问多线程
- 解决线程安全问题的最佳办法,不要写全局变量,而写局部变量。
6、ServletConfig
- 获取servlet配置信息
String encodingStr = this.getInitParameter("encoding"); // 通过继承获得
String encodingStr = super.getInitParameter("encoding"); // 通过父类获取
- 获取ServletConfig对象
ServletConfig sc = this.getServletConfig(); // 通过继承获得
ServletConfig sc = super.getServletConfig(); // 通过父类获取
7、ServletContext(重要)
- 域对象:在当前应用中,使多个Servlet共享数据
void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
Object getAttribute(String name);//从ServletContext对象的map中取数据
void rmoveAttribute(String name);//根据name去移除数据
- 获取全局配置信息
String getInitParameter(String name) //根据配置文件中的key得到value
String encoding = this.getServletContext().getInitParameter("encoding");// 获取编码方式
- 获取资源的绝对路径
String getRealPath(String path);//根据资源名称得到资源的绝对路径.可以得到当前应用任何位置的任何资源
String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/itcast/servletContext/c.properties");
- 实现Servlet转发
RequestDispatcher getRequestDispatcher(String path) ;//参数表示要跳转到哪去
RequestDispatcher rd = application.getRequestDispatcher("/servlet/ServletDemo6");
rd.forward(request, response); // 将request,response 传递下去
更多推荐



所有评论(0)