ServletContext对象、HttpServletRequest对象、HttpServletResponse对象详解

前言--------    每一天都有好多诱惑,克制自己,努力学习,终于把知识点总结完,周末这几天没怎么学。。。。走在编程的路上,加油

目录

ServletContext对象

HttpServletRequest对象

HttpServletResponse对象

演练下载资源


ServletContext对象

ServletContext对象的创建

当Tomcat服务器启动的会为每一个工程创建一个ServletContext对象,只会创建一个。

根据ServletConfig 调用 getServletContext()  获得ServletContext对象

或者直接调用  ServletContext servletContext = getServletContext(); 获取该对象

当服务器关闭的时候销毁ServletContext对象

ServletContext对象何时创建何时销毁?

服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象

从服务器移除托管,或者是关闭服务器。

ServletContext的作用范围

只要在这个项目里面,都可以取。 只要同一个项目。 A项目 存, 在B项目取,是取不到的。 ServletContext对象不同。

ServletContext对象的作用

  •  
  • 获取全局参数

1、在web.xml文件中添加全局参数,如下

<context-param>
    <param-name>name</param-name>
    <param-value>zhangsan</param-value>
</context-param>
<context-param>
    <param-name>adress</param-name>
    <param-value>lisi</param-value>
</context-param>

2、在自己的Servlet中获取全局参数,只要是是一个工程下的Servlet都可以访问该全局参数

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        //根据参数的名字获取参数对应的value值
        String name = servletContext.getInitParameter("name");
        String adress = servletContext.getInitParameter("adress");
        //获得所有参数的名字
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            String key = initParameterNames.nextElement();
            String value = servletContext.getInitParameter(key);
            System.out.println("key="+key+"   value="+value);
        }
//        System.out.println("name="+name+"   adress="+ adress);
    }

 

  •  
  • 获取web应用中资源

1、首先在web工程中建立一个资源(config.propreties)文件

2、获取该资源

第一种方法:InputStream is = new FileInputStream(绝对路径);

获得绝对路径的方法:servletContext.getRealPath(" ");   

在绝对路径的基础上找到跟具体的路径: String realPath = servletContext.getRealPath("/file/config.properties");

获得当前的相对路径:servletContext.getContextPath();

        /*
         * 这个方法写绝对路径和相对路径都可以
         * 相对路径:这里的相对路径和mysql-all里面的不一样,因为这个不是单纯的java项目,是web项      
           目,刚开始是java虚拟机管理
         * 后来就交给了Tomcat管理,所以这里的 相对路径 不能写,直接写绝对路径
         * */
//在种写法不是在Tomcat的资源根目录下
 //         InputStream is = new FileInputStream("D:\\idea\\idea_project\\javahou\\TwoServletWeb\\web\\file\\config.properties");
//这种写法表示Tomcat的根目录下的绝对路径          
InputStream is = new FileInputStream(realPath);

 

第二种方法:InputStream is = ServletContextDemo2.class.getClassLoader().getResourceAsStream("../../file/config.properties");

        /*ServletContextDemo2.class   获得当前java文件的class字节码对象
        * getClassLoader()    获得将这个class字节码对象加载到虚拟机的类加载器对象
        * (正常java项目是src目录,但是这个是web项目,后期是交给Tomcat管理,所以是classes目录下)
        * getResourceAsStream("资源的相对路径")
        * 相对路径:必须有一个参照物
        * 参照物是getClassLoader()对象的路径  D:\idea\idea_project\javahou\TwoServletWeb\web\WEB-INF\classes
        * 所以要想找到你的资源,,必须返回上一级的上一级目录,就要这样写路径   ../../file/config.properties
        *    ../../   D:\idea\idea_project\javahou\TwoServletWeb\web
        *    ../../file/config.properties    D:\idea\idea_project\javahou\TwoServletWeb\web\file\config.properties
        * */
        InputStream is = ServletContextDemo2.class.getClassLoader().getResourceAsStream("../../file/config.properties");

 注意:如果当前类没有继承HttpServlet,只是一个java类,不会交由Tomcat管理,所以getClassLoader()获得的目录是src下的目录

第三种方法:引用servletContext.getResourceAsStream()   获取资源。流对象

/*当然是隐藏的Tomcat的根路径 D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\
* 相对路径:参照物是当前路径:D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\
* file\config.properties
*
* 所以路径为:D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\file\config.properties
*
* 绝对路径:没有参照物,这里不使用
* D:\idea\idea_project\javahou\out\artifacts\TwoServletWeb_war_exploded\file\config.properties
* */
InputStream is = servletContext.getResourceAsStream("file/config.properties");//注意 / 和 \ 的区别

 

  •  
  • 实现数据在Servlet之间的共享,使用ServletContext的存取数据,作用域是一个工程内部,也叫作域对象

1、定义一个登录的html页面,定义一个form表单

2、定义一个LoginServlet,获取数据,并判断用户名密码是否正确,正确跳转新的页面,错误提示信息

并存入登录总数的信息

3、正确的页面定义一个超链接,,建立一个CountServlet,获得在LoginServlet中存入的登陆的总数,并输出

注意点:细节


	A路径: Servlet的路径
		http://localhost:8080/Demo4/login
	
	B路径: 当前这个html的路径:
		http://localhost:8080/Demo4/login.html 

<form action="login" method="get">
		账号:<input type="text" name="username"/><br>
		密码:<input type="text" name="password"/><br>
		<input type="submit" value="登录"/>
</form>

HttpServletRequest对象

HttpServletRequest作用

封装了客户端提交过来的所有数据

获取客户端请求的头信息

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //HttpServletRequest封装了客户段提交的所有信息
        //获取请求所有头信息的名字
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //获取所有头信息名字对应的值
            String value = request.getHeader(name);
            System.out.println(name+"   =    "+value);
        }
    }

获取客户端提交过来的数据

1、建立一个req.html文件,写一个form表单提交数据

2、在ServletRequestDemo中获取数据

 private void text1(HttpServletRequest request) {
        //获取客户端提交的数据,参数必须和前端中的name属性的值一致
        String username = request.getParameter("username");
        String password = request.getParameter("password");
//        System.out.println(username+"    "+ password);

        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> keySet = parameterMap.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()){
            String key = iterator.next();
            System.out.println("key="+key + "--的值总数有:"+parameterMap.get(key).length);
            String[] strings = parameterMap.get(key);
            String value = strings[0];
            System.out.println(key+"  =   "+value);
        }
    }

获取中文数据,并解决乱码问题

当客户端提交数据到服务器的时候,数据是中文的话会出现乱码问题,解决办法有以下几种方式

  • Get方式提交数据

get方式请求过来的数据,在url地址栏上就已经经过编码了,(具体以什么格式进行编码的得看前端采用的什么编码),所以我们收到的数据就乱码了。

Tomcat接受这批数据,getParameter()方法获取参数的值默认是以ISO-8859-1的编码去解码

如果编码和解码不一致,就会产生乱码

1、代码转码的方式解决

先让文字回到ISO-8859-1对应的字节数组,然后再以utf-8的格式拼接字符

2、直接配置Tomcat里面的配置文件    D:\apache-tomcat-8.5.20\conf\server.xml  ,添加URIEncoding="utf-8"

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/> 
  • POST方式提交数据

post方式提交的数据,数据是以流的方式提交给服务器的,数据在请求体中,不是跟在url后面!

Tomcat接受这批数据,getParameter()方法获取参数的值默认是以ISO-8859-1的编码去解码 

编码和解码不一致就会出现乱码

1、使用  request.setCharacterEncoding("utf-8")

这个方法表示设置  请求体  里面的文字的编码,告诉getPrameter使用什么格式的编码进行解码。如果是get方式不起作用!

如果客户端以gbk的格式进行编码发送给服务器,在服务器中使用utf-8格式进行解码,一样会乱码

这行设置一定要写在请求getParameter() 方法的前面

2、与Get方式提交数据一样,代码转码的方式

先让文字回到ISO-8859-1对应的字节数组,然后再以utf-8的格式拼接字符串

String s = new String(username.getBytes("ISO-8859-1"), "utf-8");

 

HttpServletResponse对象

HttpServletResponse作用

封装了响应给客户端一切数据,负责将数据返回到当前的页面上,并通过浏览器展示出来。

其中有重定向:是跳转到另一个页面去,不是当前的页面

其中有服务器内部跳转这个是HttpServletRequest对象:是通过服务器内部的跳转,在客户端看不出来,客户端的url还是显示当前的页面

将数据输出到当前页面上去

  • 以字符流的方式将数据写入到当前的页面上去,并通过浏览器展示出来

  • 以字节流的方式将数据写入带当前的页面上去,并通过浏览器展示出来

响应中文数据,解决乱码问题

当服务器响应给客户端数据得时候,如果数据是中文,就会出现乱码问题,解决方式有以下几种

  • 以字符流的方式输出    response.getWriter()

当向客户端输出数据以什么格式编码,在客户端以什么格式解码,编码和解码一致就不会出现乱码问题

使用response.setCharacterEncoding("utf-8");  服务器端发送数据编码

        response.setHeader("Content-Type","text/html; charset=uf-8");  客户端解码

  • 以字节流的方式输出   response.getOutStream

使用response.getOutputStream().write("哈哈哈哈哈".getBytes("UTF-8")); 服务器端发送数据编码

response.setHeader("Content-Type","text/html; charset=uf-8");  客户端解码

  • 最简单最常用的方式,写在前面,再写数据
response.setContextType("text/html; charset=utf-8")

演练下载资源

当我们的工程里面有一部分资源,希望能够让别人通过网络下载,具体演示过程如下

1、直接建一个html文件,使用超链接下载,不用写Servlet,也能够将东西下载下来

原因是因为我们的Tomcat里面有一个默认的DefaultServlet,,这个Servlet专门处理Tomcat里面的静态资源。

2、怎么才能让浏览器收到资源的时候,以下载的方式提醒用户,而不是直接展示

//直接以下载的方式提醒用户,而不是以浏览器直接展示
response.setHeader("Content-Disposition","attachment; filename="+fileName);
//获得web资源
String fileName = getParameter("fileName");
ServletContext servletContext = getServletContext();
InputStream is = servletContext.getResourceAsStream("download/"+fileName);


//读取资源
ServletOutputStream os = Oresponse.getOutputStream();
int len = 0;
byte buff = new byte[1024];  //建立一个数组,存储读出来的字节
while((len = is.read(buff)) != -1){
    //输出到客户端,以输出流的方式
    os.write(buff,0,len);
}
os.close();
is.close();


如果下载文件是中文名字的话

/*
     * 如果文件的名字带有中文,那么需要对这个文件名进行编码处理
     * 如果是IE ,或者  Chrome (谷歌浏览器) ,使用URLEncoding 编码
     * 如果是Firefox , 使用Base64编码
     */
    //获取来访的客户端类型
    String clientType = request.getHeader("User-Agent");
    //判断字符串中是否是有Firefox字符,有返回true
    if(clientType.contains("Firefox")){
        fileName = DownLoadUtil.base64EncodeFileName(fileName);
    }else{
        //IE ,或者  Chrome (谷歌浏览器) ,
        //对中文的名字进行编码处理,就是让下载弹出来的提示显示  中文的文件名
        fileName = URLEncoder.encode(fileName,"UTF-8");
    }

 

//如果是Firefox浏览器的话,使用Base64编码,使用如下方法

public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值