javaEE:day5-Servlet的相关类

演示ServletConfig–读取web.xml中的配置

获得servlet的初始化的配置参数,有三种方法中:

1 getInitParameter("name");

2 getServletConfig().getInitParameter("name");

3 在不知道参数名称的情况下: Enumeration<String> en = getServletConfig().getInitParameterNames(); 然后去遍历读取

while(en.hasMoreElements()){
            String key = en.nextElement();
            String value = getServletConfig().getInitParameter(key);
            out.println(key+":"+value);
        }

演示ServletContext

getServletContext 用于整个项目的容器。通过setAttributegetAttribute 去读写。

网站访问量: 定义一个Integer对象,通过getServletContext().getAttribute("count") 去读写这个count 。如果不存在就count=1,否则就count++。因为getServletContext是作用于整个项目,所以读写的count即使是不同浏览器不同的request每次都会加。

留言板:将request.getParameter("info"); 拿到的信息通过setAttribute写到getServletContext 中去。然后通过getServletContext 的getAttribute 去拿之前写的。这样就达到了所有用户都能看到留言。

演示ServletContext—图片浏览

这里有一个知识点:获取服务器目录中的绝对路径。通过getServletContext().getRealPath("/imgs"); 返回的就是资源的的绝对路径,中间的参数是项目根目录下的路径。

知识点1:获取初始化参数注意细节

通过thsi.getInitParamer()获取的是一个Servlet的初始化配置参数

通过getServletContext.getInitParamer()获取的是整个项目的初始化配置参数

知识点2:配置默认的servlet

在web.xml中配置servlet时,如果在 <servlet-mapping> 中的<url-pattern> 只输入一个”\” ,那么当我们这个项目的路径名不存在的时候就显示此页面。在测试的时候一般不配置,因为我们配置之后我们就看不到错误信息,通常在发布后配置,使用户即使输入错误时,不是已在在等待很久之后才显示网站空白或者不存在,而是导向我们配置的这个界面。

演示ThreadServlet—线程

(通过两个浏览器分别发一个上传用户名的请求)输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。这说明servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。尤其是servlet功能比较复杂的时候,可能会写多个方法,然后以要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!—–应该通过别的办法去解决,如通过方法参数传递,,数据库

演示图片下载

图片文件应该放在webRoot文件下

我们应该设置两个响应头:

设置响应头1–内容接收程序–浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,如果没有其它的则打开一个“文件另存为”的对话框。

设置响应头2–告诉浏览器:文件名+文件类型 ,注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开

真正的文件是通过getServletContext().getRealPath("/imgs/3.jpg");//真正下载的文件数据在这里 拿到的,然后通过IO读写

解决文件名带中文的时候,中文乱码问题

设置

fileName = URLEncoder.encode(fileName,"utf-8");

本文代码如下:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>演示servlet的其他相关类</title>
  </head>
  <body>
    <a href="config">演示ServletConfig--读取web.xml中的配置</a>
    <a href="context">演示ServletContext---A页面显示网站访问量</a>
    <a href="context2">演示ServletContext---B页面显示网站访问量</a>
    <hr/>
    <a href="msg">演示ServletContext---留言板</a>
    <hr/>
    <!-- 获取服务器目录中的绝对路径   getRealPath -->
    <a href="showImg">演示ServletContext---图片浏览</a>
    <hr/>
    <a href="thread">演示ThreadServlet---线程</a>
    <hr/>
    <a href="download">演示图片下载</a>
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>

  <servlet>
    <servlet-name>ConfigServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.ConfigServlet</servlet-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>jack</param-value>
    </init-param>
    <init-param>
        <param-name>age</param-name>
        <param-value>21</param-value>
    </init-param>
  </servlet>
  <servlet>
    <servlet-name>ContextServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.ContextServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ContextServlet2</servlet-name>
    <servlet-class>cn.hncu.servlets.ContextServlet2</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>MsgServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.MsgServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowImgServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.ShowImgServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ThreadServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.ThreadServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DownServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.DownServlet</servlet-class>
  </servlet>







  <servlet-mapping>
    <servlet-name>ConfigServlet</servlet-name>
    <url-pattern>/config</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ContextServlet</servlet-name>
    <url-pattern>/context</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ContextServlet2</servlet-name>
    <url-pattern>/context2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>MsgServlet</servlet-name>
    <url-pattern>/msg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowImgServlet</servlet-name>
    <url-pattern>/showImg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ThreadServlet</servlet-name>
    <url-pattern>/thread</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DownServlet</servlet-name>
    <url-pattern>/download</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

ConfigServlet

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 用来读取servlet的初始化配置参数
 * @author <a href="mailto:wyj950411@foxmail.com">军街</a>
 *
 * @version 1.0 2016-7-20
 */
public class ConfigServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
/**
 * 演示读取servlet中的初始化配置参数
 */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charser=utf-8");
        //方法1
        String name1 = this.getInitParameter("name");
        String age1 = this.getInitParameter("age");
        //方法2
        String name2=getServletConfig().getInitParameter("name");
        String age2=getServletConfig().getInitParameter("age");
        //在不知道参数的情况下通过读取参数  方法3:
        Enumeration<String> en = getServletConfig().getInitParameterNames();

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println("name:"+name1);
        out.println("age:"+age1);
        out.println("<hr/>");
        out.println("name:"+name2);
        out.println("age:"+age2);
        out.println("<hr/>");
        while(en.hasMoreElements()){
            String key = en.nextElement();
            String value = getServletConfig().getInitParameter(key);
            out.println(key+":"+value);
        }
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ContextServlet

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 用于整个项目的容器,这里做了两个小功能,一个是访问量,一个是留言板
 * 留言板注意:要把request.getParamer()读到的信息写到ContextServlet这个大的容器中去
 * 
 * @author <a href="mailto:wyj950411@foxmail.com">军街</a>
 *
 * @version 1.0 2016-7-20
 */
public class ContextServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    /**
     * 做网站的访问量
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        Integer count = (Integer) getServletContext().getAttribute("count");
        if(count == null || count==0){
            count=1;
        }else{
            count++;
        }
        getServletContext().setAttribute("count", count);

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println("访问人数:"+count);
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ContextServlet2

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

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

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

        response.setContentType("text/html;charset=utf-8");
        Integer count = (Integer) getServletContext().getAttribute("count");
        if(count == null || count==0){
            count=1;
        }else{
            count++;
        }
        getServletContext().setAttribute("count", count);
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println("网站目前访问人数:"+count);
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

DownServlet

package cn.hncu.servlets;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;

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

public class DownServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        //设置响应头1--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,
        //如果没有其它的则打开一个“文件另存为”的对话框
        response.setContentType("application/force-download");
        //设置响应头2--告诉浏览器:文件名+文件类型
        String fileName = "seber.jpg";
        //解决文件名带中文的时候,中文乱码问题
        fileName = URLEncoder.encode(fileName,"utf-8");
        //注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
        response.setHeader("Content-Disposition", "attachment;fileName='"+fileName+"'");
        //向浏览器发送真正的图片资源
        String realPath = getServletContext().getRealPath("/imgs/3.jpg");//真正下载的文件数据在这里
        InputStream in = new FileInputStream(realPath);
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int len= 0;
        while( (len=in.read(buf))!=-1){
            out.write(buf, 0, len);
        }
        out.close();
        in.close();

    }

}

MsgServlet

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 做留言板
 * @author <a href="mailto:wyj950411@foxmail.com">军街</a>
 *
 * @version 1.0 2016-7-20
 */
public class MsgServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    /**
     * 做一个简单的留言板,应包括日期和ip
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String msgs = (String) getServletContext().getAttribute("msgs");

        //日期
        SimpleDateFormat sim = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String date = sim.format(new Date()); 
        String ip = request.getRemoteAddr();
        String msg = request.getParameter("info");
        if(msg==null){
            msg="";
        }
        if(msgs==null){
            msgs = msg;
        }else{
            msgs = msgs+date+"&nbsp;&nbsp;"+ip+"说:"+msg+"<br/>";
        }
        getServletContext().setAttribute("msgs", msgs);
        String form = "<form action='msg' method='post'>" +
                        "评论:<input type='text' name='info'>"+
                        "<input type='submit' value='回复'>"+
                        "</form>";
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println(msgs);
        out.print("<hr/>");
        out.println(form);
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ShowImgServlet

package cn.hncu.servlets;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

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

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

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");

        //获取服务器目录中的绝对路径
        String realPath = getServletContext().getRealPath("/imgs");
        File file = new File(realPath);
        if(!file.exists()||!file.isDirectory()){
            return;
        }
        String[] fileNames = file.list();
        for(String fileName:fileNames){
            String img = "<img width=200 height=200 src='imgs/"+fileName+"' />";
            out.print(img);
        }


        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ThreadServlet

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

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

public class ThreadServlet extends HttpServlet {
    //本例(通过两个浏览器分别发一个上传用户名的请求)输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。
    //本例告诉我们,servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。
    //尤其是servlet功能比较复杂的时候,可能会写多个方法,然后以要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!
    //-----应该通过别的办法去解决,如通过方法参数传递,,数据库
    private String name;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        name = request.getParameter("name");
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(),e);
        }
        response.getWriter().write("name :"+name);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值