servlet开发总结

Servlet是一门技术,sun公司提供的用于开发动态web资源技术

Servlet技术基于 请求-- 响应模型

    1、先有请求再有响应

    2、请求响应成对出现

编写Servlet只需要 编写程序实现Servlet接口,并且在web服务器中进行注册.

Servlet编写步骤:

    1、编写class 继承HttpServlet

    2、覆盖doGet和doPost

    3、在web.xml 对Servlet 进行注册

 

Servlet接口 ------ 实现类 GenericServlet ----- 子类 HttpServlet ---- 自定义Servlet 继承HttpServlet

 

Servlet技术 sun公司最早推出时,并不是仅面向于HTTP协议的,Servlet接口规范与协议无关的

* Servlet技术基于请求-响应模型的

    GenericServlet 通用的Servlet,只是实现了与协议无关API ,并没有提供任何与协议相关API

    HttpServlet 是一个面向HTTP协议 Servlet程序,提供了与协议相关 API

    自定义Servlet都是面向HTTP协议,如果实现Servlet接口,继承GenericServlet. 使得开发更加复杂 ------ 只需要继承HttpServlet 拥有与HTTP协议相关API 开发简单

 

Servlet生命周期:描述Servlet对象从创建到销毁的过程,Servlet接口中定义了三个方法,描述了Servlet生命周期

    void init(ServletConfig config)  Servlet对象初始化方法

    void service(ServletRequest req, ServletResponse res)  Servlet对象提供服务的方法

    void destroy()  Servlet对象销毁的方法

 

第一次访问

init servlet 创建对象

init...

service ...

第二次以后访问

service ...

 

init 方法在Servlet对象被第一次访问时 执行,只执行一次

service方法 每次访问Servlet都会执行一次

destroy 正常关闭服务器时 执行

 

问题:service方法和 doGet doPost 什么关系 ???

在HttpServlet中 service方法内部,根据请求方式 调用doGet 或者 doPost

* 通过servlet_src.zip 导入 Servlet源码

 

问题:如何让Servlet在服务器启动时,加载创建对象,调用init

<servlet>

       <servlet-name>invoker</servlet-name>

       <servlet-class>

           org.apache.catalina.servlets.InvokerServlet

       </servlet-class>

       <load-on-startup>2</load-on-startup>

</servlet>

 

* 配置 load-on-startup 使Servlet在服务器启动时创建对象完成 init

 

问题:init() 和 init(ServletConfig) 关系

    init(ServletConfig) 是Servlet生命周期的方法

    GenericServlet内部 覆盖了 init(ServletConfig)  ,在有参数init方法中调用 无参数init

    * 建议 自定义Servlet只需要覆盖无参数 init 就可以了

 

URL-Pattern的三种配置方式

    1、完全路径匹配 以/开始 不能包含统配符* 例如: /hello /init

    2、目录匹配 以/开始, /*结尾例如: /*  /aa/*  /aaa/bbb/*

    3、扩展名匹配 不能以/开始,以*开始例如: *.do  *.action

经典错误:/*.do

优先级:完全匹配 > 目录匹配 > 扩展名匹配

客户端路径 加/工程名 服务器路径 不需要/工程名 ----- 尽量都用绝对路径

 

Servlet的初始化 init

    init(ServletConfig) ----- ServletConfig 对象 Servlet配置对象,用来在Servlet初始化阶段向Servlet传递信息

    * GenericServlet中将 ServletConfig对象保存成员变量,同时提供getServletConfig方法

    * 自定义Servlet中 通过 getServletConfig() 获得ServletConfig 对象

 

String getInitParameter(String name)  根据参数名称获得 值

企业级应用: load-on-startup 结合 init-param 使一个Servlet在服务器启动时执行初始化,第一时间加载配置文件 ====> Struts 框架

struts1中应用

   

<servlet>

    <servlet-name>action</servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <init-param>

      <param-name>config</param-name>

      <param-value>

          /WEB-INF/struts-config.xml,

          /WEB-INF/struts-config-Wildcard.xml

       </param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

  </servlet>


*** ServletConfig 配置参数 相当于当前Servlet 局部变量,无法被其它Servlet访问的

 

Servlet上下文对象 ServletContext

    1、ServletContext 每个工程对应一个

    2、获得ServletContext ----- > servletConfig.getServletContext();

 

应用一:全局初始化参数配置 (所有Servlet都可以访问)

* 和ServletConfig 配置初始化参数 区分开

    1) 配置全局初始化参数

<!-- 全局初始化参数 -->

  <context-param>

    <param-name>name</param-name>

    <param-value>张三</param-value>

  </context-param>

    2) 获得ServletContext对象 ServletContext context = getServletContext();

    3) 通过 String getInitParameter(String name)  获得全局参数

 

   * getMimeType(文件名) ----- 根据文件扩展名 获得文件MIME类型 html --- text/html

    自动读取tomcat/conf/web.xml (配置扩展名和MIME类型对应关系)

    * log(String msg) ----- 记录信息到日志文件 (显示控制台上)

 

应用二:多个Servlet之间可以共享数据(ServletContext唯一的)

共享全局唯一数据 :站点访问次数、数据库连接池   ----------------------------- static

setAttribute(name,object)

getAttribute(name)

 

应用三:读取web工程中资源文件

在day5工程中创建四个文件

1、在day5工程根目录 创建 1.txt

2、在WebRoot下 创建2.txt

3、在WEB-INF下 创建3.txt

4、在src下创建 4.txt

 

*** 使用带有main函数java程序(Java Application)读取文件,可以使用相对路径和绝对路径

*** 在Servlet中读取资源文件,必须使用磁盘绝对路径

 

1.txt因为在WebRoot 外面 不会发布到tomcat服务器,无法在服务器端读取

2.txt --- > getServletContext().getRealPath("/2.txt");

3.txt --- > getServletContext().getRealPath("/WEB-INF/3.txt");

4.txt 位于src下,复制到WEB-INF/classes下 ---> getServletContext().getRealPath("/WEB-INF/classes/4.txt");

 

通用classpath下文件读取方法 (用来加载器读取)

XXX.class.getResource("/4.txt").getFile();

这里/代表classpath根目录(src 、WEB-INF/classes)

 

缺省Servlet

    1、将服务器静态资源,读取到内存,发送给客户端

    2、所以服务器静态资源 都是通过缺省Servlet返回的

    3、缺省Servlet 配置 url-pattern 是 /

    4、在tomcat/conf/web.xml 查看缺省Servlet配置

 

<servlet>

        <servlet-name>default</servlet-name>

        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

        <init-param>

            <param-name>debug</param-name>

            <param-value>0</param-value>

        </init-param>

        <init-param>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

</servlet>

*** 访问文件夹,listing 为false 显示404 、如果listing 设置为true,访问文件夹时候,显示文件夹下面所有页面

 

综合案例:统计字母出现次数

 

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class getLetterNumServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String string = request.getParameter("str");
		Map<String, Integer> letterNum = getLetterNum(string);
		for (Entry<String, Integer> e : letterNum.entrySet()) {
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().print(
					"字母" + e.getKey() + "出现了" + e.getValue() + "次.<br/>");

		}

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);

	}

	public static Map<String, Integer> getLetterNum(String str) {

		Map<String, Integer> letterNum = new HashMap<String, Integer>();
		char[] charArray = str.toUpperCase().toCharArray();
		for (int i = 0; i < charArray.length; i++) {
			String temp = String.valueOf(charArray[i]);
			if (temp.matches("[A-Z]")) {
				Integer count = letterNum.get(temp);
				if (count == null)
					count = 1;
				else
					count++;
				letterNum.put(temp, count);
			}
		}

		return letterNum;

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值