JavaWeb笔记一、Servlet 详解
一、创建一个 Servlet 简单实现类
1、创建一个 HelloServlet 类(测试 Servlet 接口方法)
- 1 //创建一个 HelloServlet 类并实现 Servlet 接口
- 2 public class HelloServlet implements Servlet {
- 3
- 4 // Tomcat 停止服务时 Servlet 的销毁方法
- 5 @Override
- 6 public void destroy() {
- 7 System.out.println("destroy.....");
- 8 }
- 9
- 10 @Override
- 11 public ServletConfig getServletConfig() {
- 12 System.out.println("getServletConfig");
- 13 return null;
- 14 }
- 15
- 16 @Override
- 17 public String getServletInfo() {
- 18 System.out.println("getServletInfo");
- 19 return null;
- 20 }
- 21
- 22 // Servlet 加载时 初始化方法
- 23 @Override
- 24 public void init(ServletConfig servletConfig) throws ServletException {
- 25 System.out.println("init");
- 26 }
- 27
- 28 // servlet 运行时的方法 每次请求调用
- 29 @Override
- 30 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
- 31 System.out.println("service");
- 32 }
- 33
- 34 // HelloServlet 实现类的构造方法 加载时调用
- 35 public HelloServlet() {
- 36 System.out.println("HelloServlet's constructor");
- 37 }
- 38
- 39 }
2、配置和映射 Servlet
- 1 <?xml version="1.0" encoding="UTF-8"?>
- 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- 5 id="WebApp_ID" version="3.1">
- 6
- 7 <!-- 配置和映射 Servlet -->
- 8 <servlet>
- 9 <!-- Servlet 注册的名字 -->
- 10 <servlet-name>HelloServlet_java</servlet-name>
- 11 <!-- Servlet 的全类名 -->
- 12 <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
- 13 <!-- 可以指定 Servlet 被创建的时机 -->
- 14 <load-on-startup>1</load-on-startup>
- 15 </servlet>
- 16
- 17 <servlet-mapping>
- 18 <!-- 需要和某一个 Servlet 节点的 servlet-name 子节点的文本节点一致 -->
- 19 <servlet-name>HelloServlet_java</servlet-name>
- 20 <!-- 映射的具体访问路径: / 代表当前 Web 应用的根目录. -->
- 21 <url-pattern>/hello</url-pattern>
- 22 </servlet-mapping>
- 23
- 24 </web-app>
二、Servlet 生命周期
Servlet 生命周期的方法: 以下方法都是由 Serlvet 容器负责调用.
1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器. 这说明 Serlvet 的单实例的!
2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet.
3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的.
4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源.
三、ServletConfig 对象(getInitParameterNames、getInitParameter、getServletName(不常用)、getServletContext四个接口方法)
1、在 web.xml 文件中配置 servlet 的初始化参数(init-param 节点)
- 1 <?xml version="1.0" encoding="UTF-8"?>
- 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
- 5 id="WebApp_ID" version="3.1">
- 6
- 7 <!-- 配置和映射 Servlet -->
- 8 <servlet>
- 9 <!-- Servlet 注册的名字 -->
- 10 <servlet-name>HelloServlet_java</servlet-name>
- 11 <!-- Servlet 的全类名 -->
- 12 <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
- 13
- 14 <!-- 配置 Servlet 的初始化参数 -->
- 15 <init-param>
- 16 <!-- 参数名 -->
- 17 <param-name>user</param-name>
- 18 <!-- 参数值 -->
- 19 <param-value>root</param-value>
- 20 </init-param>
- 21
- 22 <init-param>
- 23 <param-name>password</param-name>
- 24 <param-value>123456</param-value>
- 25 </init-param>
- 26
- 27 <!-- 可以指定 Servlet 被创建的时机 -->
- 28 <load-on-startup>1</load-on-startup>
- 29 </servlet>
- 30
- 31 <servlet-mapping>
- 32 <!-- 需要和某一个 Servlet 节点的 servlet-name 子节点的文本节点一致 -->
- 33 <servlet-name>HelloServlet_java</servlet-name>
- 34 <!-- 映射的具体访问路径: / 代表当前 Web 应用的根目录. -->
- 35 <url-pattern>/hello</url-pattern>
- 36 </servlet-mapping>
- 37
- 38 </web-app>
2、servlet实现类的 init()方法中 ServletConfig 对象实例(ServletConfig的getInitParameterNames、getInitParameter、getServletName(不常用)方法实例)
- 1 // Servlet 加载时 初始化方法
- 2 @Override
- 3 public void init(ServletConfig servletConfig) throws ServletException {
- 4 System.out.println("init");
- 5
- 6 // 获取初始化参数值
- 7 String user = servletConfig.getInitParameter("user");
- 8 System.out.println("user:" + user);
- 9
- 10 // 获取初始化参数名和值
- 11 Enumeration<String> names = servletConfig.getInitParameterNames();
- 12 while (names.hasMoreElements()) {
- 13 String name = names.nextElement();
- 14 String value = servletConfig.getInitParameter(name);
- 15 System.out.println("^^name:" + name + ":" + value);
- 16 }
- 17
- 18 // 获取 Servlet 注册名称
- 19 String servletName = servletConfig.getServletName();
- 20 System.out.println(servletName);
- 21 }
3、在 servlet 实现类的 init()方法中 通过 ServletConfig 对象得到 ServletContext 对象
ServletContext的常见方法: getInitParameter()、getInitParameterNames()、getRealPath()、getContextPath()、getResourceAsStream()
- 1 // Servlet 加载时 初始化方法
- 2 @Override
- 3 public void init(ServletConfig servletConfig) throws ServletException {
- 4 System.out.println("init");
- 5
- 6 // WEB初始化参数: 可以为所有的 Servlet 所获取, 而 Servlet 的初始化参数只用那个 Serlvet 可以获取.
- 7 // 获取 ServletContext 对象
- 8 ServletContext servletContext = servletConfig.getServletContext();
- 9
- 10 // 获取当前 WEB 初始化参数值
- 11 String driver = servletContext.getInitParameter("driver");
- 12 System.out.println("driver:" + driver);
- 13
- 14 // 获取当前 WEB 初始化参数名和值
- 15 Enumeration<String> name2 = servletContext.getInitParameterNames();
- 16 while (name2.hasMoreElements()) {
- 17 String name = name2.nextElement();
- 18 String value = servletContext.getInitParameter(name);
- 19 System.out.println("-->" + name + ":" + value);
- 20 }
- 21
- 22 // 获取当前 WEB 应用的某一个文件在服务器上的绝对路径, 而不是不部署前的路径
- 23 String realPath = servletContext.getRealPath("/111.txt");
- 24 // 不是 E:\eclipse\workspace\JavaWeb\WebContent\111.txt
- 25 System.out.println(realPath);
- 26
- 27 // 获取当前 WEB 应用的名称
- 28 String contextPath = servletContext.getContextPath();
- 29 System.out.println(contextPath);
- 30
- 31 // 获取一个文件的输入流(部署前的路径)
- 32 try {
- 33 ClassLoader classLoader = getClass().getClassLoader();
- 34 InputStream is = classLoader.getResourceAsStream("jdbc.properties");
- 35 System.out.println("1." + is);
- 36 } catch (Exception e) {
- 37 e.printStackTrace();
- 38 }
- 39
- 40 // 获取一个文件的输入流(服务器上的路径)
- 41 try {
- 42 InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
- 43 System.out.println("2." + is2);
- 44 } catch (Exception e) {
- 45 e.printStackTrace();
- 46 }
- 47 }
四、servlet 实现类的 service()方法中的 Request 对象
1、Request 的常用方法: getParameter(String name)、getParameterValues(String name)、getParameterNames()、getParameterMap()
- 1 // 用于应答请求: 因为每次请求都会调用 service() 方法
- 2 // ServletRequest: 封装了请求信息, 可以从中获取到任何的请求信息
- 3 // ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现
- 4 @Override
- 5 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
- 6 System.out.println("请求成功.......");
- 7 System.out.println(request);
- 8
- 9 // String getParameter(String name): 根据请求参数的名字, 返回参数值.
- 10 String user = request.getParameter("user");
- 11 String password = request.getParameter("password");
- 12 System.out.println(user + "," + password);
- 13
- 14 // getParameter()方法只能获取一个参数值
- 15 String interesting = request.getParameter("interesting");
- 16 System.out.println(interesting);
- 17
- 18 // String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组
- 19 String[] interestings = request.getParameterValues("interesting");
- 20 for (String string : interestings) {
- 21 System.out.println("-->" + string);
- 22 }
- 23
- 24 // Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,类似于
- 25 // ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
- 26 Enumeration<String> names = request.getParameterNames();
- 27 while (names.hasMoreElements()) {
- 28 String name = names.nextElement();
- 29 String valuee = request.getParameter(name);
- 30 System.out.println("==>" + name + ", " + valuee);
- 31 }
- 32
- 33 // Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
- 34 Map<String, String[]> map = request.getParameterMap();
- 35 for (Map.Entry<String, String[]> entry : map.entrySet()) {
- 36 System.out.println("**" + entry.getKey() + ":" + Arrays.asList(entry.getValue()));
- 37 }
- 38 }
2、httpServletRequest 的常用方法:getRequestURI()、getMethod()、getQueryString()、getServletPath()
- 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
- 2 System.out.println("请求成功.......");
- 3 System.out.println(request);
- 4 // 获取请求的 URI
- 5 HttpServletRequest httpServletRequest = (HttpServletRequest) request;
- 6 String requestURI = httpServletRequest.getRequestURI();
- 7 System.out.println(requestURI);
- 8
- 9 // 获取请求方式
- 10 String method = httpServletRequest.getMethod();
- 11 System.out.println(method);
- 12
- 13 // 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.
- 14 String queryString = httpServletRequest.getQueryString();
- 15 System.out.println(queryString);
- 16
- 17 // 获取请求的 Serlvet 的映射路径
- 18 String servletPath = httpServletRequest.getServletPath();
- 19 System.out.println(servletPath);
- 20 }
五、servlet 实现类的 service()方法中的 Response 对象
Response 目前常用方法:setContentType()、getWriter()
- 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
- 2 System.out.println("请求成功.......");
- 3 System.out.println(request);
- 4 // 设置响应方式
- 5 response.setContentType("application/msword");
- 6
- 7 // 在页面响应一个内容
- 8 PrintWriter out = response.getWriter();
- 9 out.println("HelloWorld...");
- 10 }
六、GenericServlet 实现 Servelt、ServletConfig接口
- public abstract class MyGenericServlet implements Servlet, ServletConfig {
- // 以下方法为 Servlet 接口的方法
- @Override
- public void destroy() {
- }
- @Override
- public ServletConfig getServletConfig() {
- return servletconfig;
- }
- @Override
- public String getServletInfo() {
- return null;
- }
- private ServletConfig servletconfig;
- @Override
- public void init(ServletConfig arg0) throws ServletException {
- this.servletconfig = arg0;
- init();
- }
- public void init() throws ServletException {
- }
- @Override
- public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
- // 以下方法为 ServletConfig 接口的方法
- @Override
- public String getInitParameter(String arg0) {
- return servletconfig.getInitParameter(arg0);
- }
- @Override
- public Enumeration<String> getInitParameterNames() {
- return servletconfig.getInitParameterNames();
- }
- @Override
- public ServletContext getServletContext() {
- return servletconfig.getServletContext();
- }
- @Override
- public String getServletName() {
- return servletconfig.getServletName();
- }
- }
七、HttpServlet 继承 GenericServlet类
- public class MyHttpServlet extends MyGenericServlet {
- @Override
- public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
- if (arg0 instanceof HttpServletRequest) {
- HttpServletRequest request = (HttpServletRequest) arg0;
- if (arg1 instanceof HttpServletResponse) {
- HttpServletResponse response = (HttpServletResponse) arg1;
- service(request, response);
- }
- }
- }
- public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // 1.获取请求方式
- String method = request.getMethod();
- // 2.根据请求方式再调用对应的处理方法
- if ("get".equalsIgnoreCase(method)) {
- doGet(request, response);
- } else if ("set".equalsIgnoreCase(method)) {
- doPost(request, response);
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- }
- }
JavaWeb笔记一、Servlet 详解的更多相关文章
- Servlet详解
原文出处:http://blog.csdn.net/q547550831/article/details/50458456 Servlet详解 基本概述 Session在计算机中,尤其是在网络应用中, ...
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...
- Java Servlet详解(体系结构+注解配置+生命周期)
Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...
- Hive笔记--sql语法详解及JavaAPI
Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...
- Java Web(一) Servlet详解!!
这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...
- Struts2学习笔记(二)——配置详解
1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...
- (转)Java Web(一) Servlet详解!!
https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...
- javaweb web.xml文件详解
web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...
- 算法笔记--sg函数详解及其模板
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...
- web开发(一)-Servlet详解
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6399262.html>,在此仅供学习参考之用. 一.什么 ...
随机推荐
- 剑指offer(纪念版)读书笔记【实时更新】
C++ 1.STL的vector每次扩充容量,新容量是前一次的两倍. 2.32位机指针大小为4个字节,64位机指针大小为8个字节. 3.当数组作为函数参数传递时,数组会自动退化成同类型指针. 4. & ...
- 不可不知的socket和TCP连接过程
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- 【POJ】3090 Visible Lattice Points(欧拉函数)
Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7705 Accepted: ...
- P3377
题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆 ...
- An Introduction to Variational Methods (5.3)
从之前的文章中,我们已经得到了所有需要求解的参数的优化分布的形式,分别为: 但是,我们从这些分布的表达式中(参见之前的文章),可以发现这些式子并不能够直接求解.这是因为各个参数之间相互耦合,从而导 ...
- js-注释代码习惯
功能块代码 /** * xxxx */ 定义的函数或方法 /* xxxx */ 调用了某个函数或方法 // <--xxx
- IDL 字符串
1.创建字符串 字符串和字符串数组通过赋值或函数方式来创建.在IDL字符串用" "或' '括起来表示. IDL> s1="abcdef" IDL> ...
- 使用beanstalkd实现定制化持续集成过程中pipeline
持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...
- 逆波兰表达式(RPN)算法简单实现
算法分析: 一.预处理 给定任意四则运算的字符串表达式(中缀表达式),preDeal预先转化为对应的字符串数组,其目的在于将操作数和运算符分离. 例如给定四则运算内的中缀表达式: String inf ...
- DevOps之域名
唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. 域名系统DNS(Domain Name System) 关于域名,知识与技能的层次(知道.理解.运用) ...