servlet

文章目录

  • java servlet
    • 如何在Tomcat中自己编写一个Java类(控制层Servlet)
    • servlet中文问题
      • get请求的处理方式
      • post请求的处理方式
    • Servlet类的管理机制
      • 1. Servlet类的对象是单例设计模式(对象是唯一的)
      • 2. 单例对象的产生
      • 3. Servlet对象的创建和销毁---->Servlet对象的生命周期问题
      • 4. 默认效果是一个延迟加载的机制
      • 5. 如果想要改变对象的加载 从延迟的方式变成立即的方式(Tomcat启动的时候就创建对象)
      • 6. 在Servlet对象创建时,可以通过配置携带一些信息,就可以让Servlet对象读取到
      • 7. Servlet继承的关系????

java servlet

1.可以通过访问Tomcat来找到文件资源
.html文件
2.可以通过访问Tomcat来找到操作资源
java类-----控制层Servlet

​ V:View 视图层 HTML+CSS+JS
​ C:Controller 控制层 HttpServlet
​ M:Model 模型层
​ 数据处理Service
​ 数据读写Dao
​ 数据存储domain
​ DB:DataBase 数据库MySQL
servlet_第1张图片

如何在Tomcat中自己编写一个Java类(控制层Servlet)

  1. 自己定义一个类 通常叫XXXController (Servlet Action)
  2. 继承Tomcat提供的一个规则HttpServlet
  3. 重写一个方法service 有参数 没有返回值 (doPost doGet)
  4. 方法内部有两个参数HttpServletRequest HttpServletResponse
  5. 抛出两个异常 ServletException IOException
  6. 方法是没有返回值 void类型
  7. 需要告知Tomcat有一个自己定义类需要帮忙管理 web文件夹 WEB-INF文件夹
    需要配置web.xml 请求名字----真实类全名 映射关系
   
		用来配对的名字
		真实类全名
	
	
		用来配对的名字
		/请求名字
    
  1. 浏览器发送请求
     访问操作资源
     404 没有找到资源 检查xml文件 检查Controller类
     405 没有找到执行方法 检查Controller类中的方法重写

servlet中文问题

get请求的处理方式

发送请求的时候 请求名字 携带的参数信息都在协议头中
浏览器解析的时候
如果Tomcat是老版本 get请求需要如下处理

           String aname = request.getParameter("aname");
			byte[] value = aname.getBytes("ISO-8859-1");
			String newString = new String(value,"UTF-8");

如果Tomcat是新版本 可以不处理

post请求的处理方式

发送请求的时候 请求名字 协议头中
请求的参数信息是在协议体中(协议体只能传递字节)
浏览器解析的时候
控制层接受的时候已经组合成一个String字符串
发送请求的时候按照UTF-8形式 拆开字节
接受的时候request对象直接给我组合(按照平台默认的字符集)成一个String
在request组合之前告知 按照哪一种字符集进行组合

     request.setCharacterEncoding("UTF-8");

servlet_第2张图片

Servlet类的管理机制

1. Servlet类的对象是单例设计模式(对象是唯一的)

采用生命周期托管的方式实现的
 Tomcat底层有一个类似ServletController的类管理着我们的对象(servlet对象)

2. 单例对象的产生

立即加载(Tomcat启动的时候 底层集合内就存在对象啦)
 延迟加载(Tomcat启动的时候没有对象产生 什么时候发送请求需要用到这个对象 才会创建)
   Tomcat启动的时候 web.xml文件如果写错了 服务器启动会报错
   证明Tomcat在启动的时候 就读取了我的web.xml配置文件
   web.xml文件配置的目的 存储请求名字—真实资源类名的对应关系

3. Servlet对象的创建和销毁---->Servlet对象的生命周期问题

Tomcat为了更好的管理对象的产生和销毁
   提供了三个方法---->标识Servlet对象的生命周期
   init(); service(); destroy(); 重新部署项目

4. 默认效果是一个延迟加载的机制

是否可以改变成立即加载的方式呢?
  加载Servlet对象的时候是否能携带一些信息?
  web.xml文件(如果配置错误 启动Tomcat时候就产生问题)
  说明Tomcat启动的时候读取了我们的配置文件---->请求 真实类名
  启动时候可能会有很多的Servlet对象 如果是立即加载的话 内存压力很大

5. 如果想要改变对象的加载 从延迟的方式变成立即的方式(Tomcat启动的时候就创建对象)

在web.xml文件中添加一个配置就可以了

		
			
			
			0开始的整数 整数越小加载越早
			整数0 
		
		
		

6. 在Servlet对象创建时,可以通过配置携带一些信息,就可以让Servlet对象读取到

	
			<>
			<>
			
				key1
            	value1
			
			整数0
		
		
		

在Servlet对象的init方法中进行读取 通常利用带ServletConfig参数的方法

String value = config.getInitParameter("key");      //某一个key对应的value
Enumeration = config.getInitParameterNames();  //获取全部的key
String = config.getServletName();                        //获取当前Servlet类名
ServletContext application = config.getServletContext();//获取全局上下文对象

7. Servlet继承的关系???

自己写一个类—>继承抽象类HttpServlet
  HttpServlet—>继承抽象类GenricServlet
  GenricServlet–>实现了三个接口 Servlet ServletConfig Serializable
  Servlet接口含有5个方法
   init(ServletConfig config);
   service(ServletRequest,ServletResponse);
   destroy();
   ServletConfig = getServletConfig();
   String = getServletInfo();
  ServletConfig接口含有4个方法
   String value = config.getInitParameter(“key”);
   Enumeration = config.getInitParameterNames();
   String = config.getServletName();
   ServletContext application = config.getServletContext();
  GenricServlet抽象类体现出了缺省适配器模式
   将上述两个接口中的8个方法全部添加了实现
   只留下一个service抽象方法 需要用户自己填写逻辑
   还添加了两个独有的方法 init(){} 无参数 log(){}
  HttpServlet体现了对于协议的具体化
   将父类service方法实现了
   目的是将两个跨协议的参数强制转化成HTTP协议
  自己添加了一个protected修饰的service方法(参数HttpServletRequest)
   独有service方法的目的是通过请求发送的方式get/post
   找寻对应具体的执行方法doGet doPost

你可能感兴趣的:(java学习笔记)