java学习之服务器第25天( --Sevrlet对象--ServletConfig配置对象--SevrletContext域-- )

1. Servlet 

        定义: ( 小型服务器接口) 是Java里面的接口;

       访问服务器: 实际上就是访问Sevrlet ( Sevrlet是个容器,里面有访问的动态资源 );

      Servlet的生命周期方法; 实例化--初始化---服务方法--销毁方法;

    注意:  Sevrlet只创建一次,当你再次访问Sevrlet的时候,不会创建新的Sevrlet,只会调用service方法;

                访问Sevrlet需要通过xml配置文件来访问!

    1.1  创建sevrlet第一种方式:  直接实现Sevrlet接口

public class Demo01 implements Servlet {
	
	//实例化方法(创建对象无参构造方法)  不管声明周期是啥,对象先创建出来
	 public Demo01() {
		System.out.println("实例化对象的无参构造方法");
	}

	// 出生声明周期方法;初始化方法,初始化Servlet配置信息; 穿进去参数就是配置信息;
	public void init(ServletConfig arg0) throws ServletException {
	     System.out.println("初始化init方法被调用了");
	 
	}

	
	// 服务方法接收请求,响应结果; ----作用处理用户的请求,处理完成之后响应给用户;
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
	          System.out.println("service方法被调用");
	}

	
	// Servlet 的 销毁 
	//1.服务器关闭被调用,相当于停止会调用
	//2.该应用程序被移除也会调用,
	public void destroy() {
		System.out.println("我是destory销毁方法被调用了");

	}


	//获取Servlet配置信息的方法;
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	//获取Servlet版本作者等信息的方法;
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

}

2. 创建方式2 

           利用( 缺省适配器 ) 继承了一个实现了Sevrlet接口的类( GenericServlet );

            然后只重写一个service方法就行了

public class Demo02  extends GenericServlet{

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		
		System.out.println("demo02的----service");
	}

}

3. 创建方式3

         继承  一个继承了( GenericServlet 类 ) 的类!

          重写 doGet和doPost方法!  ( 浏览器是访问是doGet里面的内容 )

         浏览器发送的请求,都是get请求! 在post的方法里面调用doget()放法;用一种

     GET和POST请求区别  https://zhidao.baidu.com/question/1695925461424058828.html 

public class Demo03 extends HttpServlet {
	// 重写doGet和doPost方法; get和post方式,
	// 注意重写完之后不要调用父类的,doGet方法, 否则只会发送错误;
	// 从浏览器发送的请求,都是get请求;(拼接字符串)

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet");
	}

	
	//不管什么方式都可以调用doGet两种请求共用一个处理方式;
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

二 . 获取Sevrlet的配置对象

       2.1 servletConfig对象( 每个sevrlet都有 )  共两种方式;在配置文件里面sevlet标签里面;

      当servlet配置了初始化参数后,web容器在创建servlet对象的时候会自动将这些初始化参数分装到ServletConfig对象当中去,并在调用servlet的init方法的时候将ServletConfig对象传递给servlet,进而程序员可以通过ServletConfig对象就可以获得web应用的初始化参数。

方式1:

public class Demo01 extends HttpServlet {
	//获取方式1.声明一个成员变量.保存该对象;
	 private ServletConfig config;
	
	//初始化方法:
	 @Override
	public void init(ServletConfig config ) throws ServletException {
	  super.init(config);
	  //给成员变量赋值;
	  this.config=config;
	}

方式2.直接调用父类的方法;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//fun1获取config信息();
		//获取方法2,直接调用父类的方法;
		ServletConfig myconfig = this.getServletConfig();
		String value = myconfig.getInitParameter("dahai");
		System.out.println(value);
		
	}


3.获取多个配置信息

private void fun1获取config信息() {
		System.out.println(this.config);
		// 可以通过config对象,获取servlet的配置信息; 我们自己写
		// 获取servlet配置信息
		String value = this.config.getInitParameter("wanglong");
		System.out.println(value);
		// 获取多个配置信息
		Enumeration<String> names = this.config.getInitParameterNames();
		while (names.hasMoreElements()) {
			System.out.println(names.nextElement());
		}
	}

2.2 域对象    ---SevrletContext ( 作用范围最大的域对象 )

 * 域对象: 域表示一定的范围内 有作用的对象,
 *   SevrletContext(作用范围最大的域对象)       Context: 环境
 *   作用域整个工程 都能使用该对象;
 *   并且整个项目只有一个该对象(单例对象) 
 *   作用: 利用单例的特点, 可以进行传值,该对象内部维护了一个map集合;(实际上就是一个map集合)
 *   注意: 所有的域对象 内部都是维护一个map集合,都可以保存和获取值;
 *        所有的域对象都有setAttribute 
 *                     getAttribute() 方法;
 *                  
 *   
 *   获取SevrletContext对象,
 *      方式1: 可以通过SevrletConfig对象来获取;
 *      方式(2) 通过父类方法来获取 该方法在SevrletConfig接口中
 *   
 *   
 *    作用1: 存值取值 
 *    作用2: 获取全局配置信息
 *    作用3: 获取服务器上所有的资源真实路径;
 *           真实路径(在服务器上的路径)
 *           getRealPath();
 *    作用4: 可以进行请求转发; 

  1.获取域对象

     方式1;先获取ServletConfig,再获取SevrletContext;
	private void fun1获取configcontext() {
		ServletContext context = this.getServletConfig().getServletContext();
	}
      方式2 直接调用从父类继承过来的方法;
ServletContext context = this.getServletContext();
  2: 域对象在Xml配置文件中存在的位置!


 

  3.1  作用1: 存值取值

public class Demo02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext context = this.getServletConfig().getServletContext();
		 // 向context中保存一个值  可以demo02 存 demo03取
		 //先访问2,再访问3;
		  context.setAttribute("username", "wanglong");  //此处往context里面存值;
		
	}
}

      2.可以在demo03中进行获得值  getAttribute( " username" )

package com.lanou3g;

import java.io.IOException;

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

public class Demo03 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取域对象
		ServletContext context = this.getServletConfig().getServletContext();
		Object object = context.getAttribute("username");
		System.out.println(object);
	}

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

}
  3.3 : 作用三 :获取服务器上的资源路径 getRealPath( "服务器上相对于Webcontent 的路径" )

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//读取a文件
		//参数的路径是相对于工程名来填的;  也就是sh-web-02的路径; 让人从服务器上下载;
		  // fun1();
		//读取b文件,b文件是挂在服务器上的;
		String realPath = this.getServletContext().getRealPath("WEB-INF/classes/com/lanou3g/b.properties");
		System.out.println(realPath);
		FileInputStream fileInputStream = new FileInputStream(realPath);
		Properties properties = new Properties();
		properties.load(fileInputStream);
		System.out.println(properties.getProperty("key"));
}
3.4 : 作用四: 请求转发:  ( 请求一次做了多次跳转 )

 1. 第一步获取转发器: 

        getRequestDispatcher( "/demo06" );

1. 第二步请求转发: 利用转发器

          forward( request, response )        

package com.lanou3g;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 请求转发; 我们只访问了demo05 可以把Demo06的内容打印出来;
 *   1. 用户只发送了一次请求,并且用户请求时并不知道网站内部做了什么操作;
 */
public class Demo05 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("晓峰借点钱给我");
		System.out.println("我没有钱  坤有钱 你去找他");
		// 第一步 通过context对象获取请求转发器
		//注意: 请求转发只能是本工程站内转发;
		//填转发路径是相对于你的工程;  /杠代表工程名后面的路径;  你要给他一个去往的路径;
		 RequestDispatcher requestDispatcher = this.getServletContext().getRequestDispatcher("/demo06");
		//第二步请求转发; 利用转发器  
		 requestDispatcher.forward(request, response);
		 
		 System.out.println("钱接到了,人傻好办事");
	}

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

}
4. 如何写文字到浏览器   : 接到请求后服务器doGet方法触发 

         1. 通过响应对象response中的流对象 回写到浏览器,可以获取字符流

            PrintWriter   writer =   response. getWriter();

                P.writer( "欧阳" ); 

         注意:TomCat默认的编码格式是 iso-8859-1.写到浏览器上会乱码!

解决方式1 :  第一步设置编码个格式 : response.setCharaterEncoding( "UTF-8" )   --- 解决编码格式问题!

                 第二步: 设置响应头,告诉浏览器用什么格式来解析,        解决解析格式问题

                     response.setContentType(  " text/html;charset=utf-8 " )---告诉浏览器用utf-8来解析;

     5. 响应  ( response)

    响应行: 响应状态码  200表示ok;

    响应头: 告诉浏览器你要有什么操作;

    响应体:响应浏览器内容


 6. 如何从服务器中下载图片.

     第一步: 选中一张图片放入到服务器中: 注意放入src下面相当于放在classes下面;

     第二步:  添加响应头;1. 为了告诉浏览器 你这张图片是要下载  2: 告诉浏览器文件的名字和文件类型

      content-disposition   attachment;filename=    ( 如何获取文件名 tz.png )

      content-type   image/jpeg  ------  tomcat config 里面有个web-xml 里面有格式;


   第三步: 开始读文件 使用FileInputStream进行读文件;

   第四步:从响应里面获取:写的文件 response.getOutputStream();

   第五步:开始你的读写;


	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取服务器的图片路径
		// 一般context域 使用application当名字 如果放在src下面 就是这个路径("/WEB-INF/classes/tz.png")
		// 找到域然后找到路径;
		String realPath2 = this.getServletContext().getRealPath("/WEB-INF/classes/tz.png");

		// 截取文件名
		File file = new File(realPath2);
		String filename = file.getName();
		
		//修改文件名下载格式
		filename = new String(filename.getBytes(), "iso-8859-1");
		
		// 添加响应头
		response.setHeader("content-disposition", "attachment;filename=" + filename);
		response.setHeader("content-type", "png");

		//读文件
		FileInputStream fileInputStream = new FileInputStream(realPath2);
		//通过response对象 获取字节流; 从响应流中获取到的流,目的地就是网站; 所以你就不用给写的路径了;
		ServletOutputStream outputStream = response.getOutputStream();
		//将图片写回服务器 ;回写
		int len=0;
		byte [] bs= new byte[1024];
		while ((len=fileInputStream.read(bs))!=-1) {
			//将图片写回服务器
			outputStream.write(bs, 0, len);
		}
		    fileInputStream.close();
	}

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

7.请求重定向

      注意: 可以填站内路径,也可以填站外路径, 如果站内路径需要带上工程名, 和请求转发不一样;

             2. 请求重定向是两次请求, 第二次是接收到第一次请求以后发出的,;

      实现方式:   第一步:  添加响应头: response.setHeader( "location",/sh-web-02/demo11 ); 

                                               站外: response.setHeader( " http://www.baidu.com" )

                          第二步: 添加响应状态码 302:   response.setStatus( 302 );   

  7.1   设置3秒后跳转一个页面 3秒后开始跳转; 和每隔一秒刷新一下页面

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//fun1(response);
		
		//3秒后跳转一个页面  3秒后开始跳转;调转到 demo11去;
		//response.setHeader("refresh", "3;url=/sh-web-02/demo11");
		
		//每隔1秒刷新界面
		 response.setIntHeader("refresh", 1);
		 PrintWriter writer = response.getWriter();
		 //随机数是double类型
		 writer.write(Math.random()+"");
		
	}

8 .获取请求中路径的方法 request. getMethod()  --getRequestURL() URI()  getContextPath();
		//System.out.println("rsjfsdjflksadjf;dlsajfklsadjfl;dsajfkl;dsajfk;jdsal;kfj");
		//请求中的方法
		//获取请求的而方式, 是get 还是post;
		String method = request.getMethod();
		System.out.println(method); //从浏览器出来的都是get请求;
		//获取请求的URL;  http://localhost:8080/sh-web-02/demo11
		StringBuffer requestURL = request.getRequestURL();
		System.out.println(requestURL);
		//获取请求的URI; /sh-web-02/demo11    getRequestURI()获取请求页面的相对路径,
		String requestURI = request.getRequestURI();
		System.out.println(requestURI);
		//获取请求网址的相对路径  /sh-web-02
		String contextPath = request.getContextPath();
		System.out.println(contextPath);
		
		//获取表单提交的数据
	

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值