javaee之servlet的方法详解

来源:互联网 发布:丁彦雨航体测数据 编辑:程序博客网 时间:2024/06/06 18:39

ServletConfig类

概念和作用

 ServletConfig类,servlet配置类,主要用于读取servlet的配置

获取ServletConfig对象

this.getServletConfig() 获取ServletConfig对象

读取servlet配置

1)在web.xml配置一个servlet的参数:

 

  <servlet>

    <servlet-name>ConfigDemo</servlet-name>

    <servlet-class>gz.itcast.a_config.ConfigDemo</servlet-class>

    <!-- servlet配置 -->

    <init-param>

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

       <param-value>e:/names2.txt</param-value>   

    </init-param>

  </servlet>

 

2)读取init-param的数据,通过ServletConfig的方法读取:

 

ServletContxt类

 概念和作用

ServletContext,servlet上下文对象,代表的是当前的整个web应用!!!!!

注意:在一个web应用中,只有一个ServletContext!!!

 

 获取ServletContext对象

1)  this.getServletConfig().getServletContext()    获取ServletContext对象

2) this.getServletContext() (推荐)  获取ServletContext对象

 

作用

1)读取web应用的配置信息(全局的,所有的servlet都可以获取)

                  

 

 

步骤:

    1)在web.xml配置web应用配置(全局参数)

                           

  <!-- web应用配置(全局) -->

  <context-param>

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

    <param-value>utf-8</param-value>

  </context-param>

 

 

         2)在Servlet中读取context-param:

 

                  

//1.获取ServletContext

       ServletContext context =this.getServletContext();

       String encoding = context.getInitParameter("encoding");

       System.out.println(encoding);

     

 

2)在当前web应用中作为域对象使用

 


 

         域对象的作用:

                   用来在不同的资源(servlet)之间共享数据!!!!!

 

         域对象方法:

                   setAttribute("name",Object)    保存数据

                   getAttribute("name")        获取数据

                   removeAttribute("name")     清空数据

                  

                   步骤:

                   1)保存:

//保存数据保存到域对象(ServletContext)

       ServletContext context = this.getServletContext();

       context.setAttribute("p", p);

     

 

         2)获取:

                  

//从域对象(ServletContext)取出数据

       ServletContext context = this.getServletContext();

       String p = (String)context.getAttribute("p");

       response.getWriter().write("p="+p);

 

 

3)转发到web应用内的其他页面

 

 

       //转发

       //跳转到succ.html页面

       /*ServletContext context = this.getServletContext();

       //  /: 在当前web应用

       RequestDispatcher rd = context.getRequestDispatcher("/succ.html");

       rd.forward(request, response);*/

      

      

       //转发简化版:

       request.getRequestDispatcher("/succ.html").forward(request, response);

 

 

 

4)读取web应用内的文件

        

 

    //1.getRealPath():  获取某个文件的绝对路径

    /*  ServletContext context = this.getServletContext();

       //  /: 代表web应用的根目录(部署到tomcat后的web应用)

       //String path = context.getRealPath("/db.properties");

       String path = context.getRealPath("/WEB-INF/classes/db.properties");

       System.out.println(path);

      

       File file = new File(path);

       FileInputStream in = new FileInputStream(file);*/

 

      

       //2. getResourceAsStream() : 获取的某个文件的输入流

       ServletContext context = this.getServletContext();

       // getRealPath()的路径写法一样!!!!

       InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");

 

 

以前:IO

 

new File("e:/files/mm.jpg")  绝对路径

new File("./files/mm.jpg")  相对路径

 

不要这么写: new File("/files/mm.jpg")

 

现在:web

 

getRealPath("/files/mm.jpg")

getResourceAsStream(/files/mm.jpg"")

 

不要这么写:

getRealPath("e:/files/mm.jpg")

getRealPath("./files/mm.jpg")

 

4、接收请求

使用servlet接收请求和响应请求!!!

 

service(HttpServletRequest req,HttpServletResponse resp)

 

HttpServletRequest:请求对象。主要用于接收请求数据。

HttpServletResponse: 响应对象,主要用于设置响应数据。

 

4.1 HttpServletRequest对象

HttpServletRequest对象封装所有浏览器发过来的信息。

 

请求格式:

请求行

请求头

空行

请求正文

4.2核心方法(重点)

请求行:

    请求方式: 

    请求路径:

   GET提交的数据:

    http协议版本:

 

请求头:

   

 

请求正文:

 

通用的获取用户提交数据:

 

//演示request对象的核心方法

public class RequestDemo1 extends HttpServlet {

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //1.请求行

       //1.1 请求方式

       System.out.println("请求方式:"+request.getMethod());

       //1.2 请求路径

       System.out.println("请求路径的uri"+request.getRequestURI());

       System.out.println("请求路径的url"+request.getRequestURL());

       //1.3 http版本号

       System.out.println("http协议:"+request.getProtocol());

       //1.4 get方式提交的数据

       System.out.println("get提交数据:"+request.getQueryString());

      

       //2. 请求头

       //获取某个名称的头(用的多)

       System.out.println(request.getHeader("User-Agent"));

       //获取所有的头名称

       //Enumeration enums = request.getHeaderNames();

       //获取多个同名的头

       //Enumeration enums = request.getHeaders("User-Agent");

       //获取到整数类型的头

       //int dnt = request.getIntHeader("DNT");

       //int dnt = Integer.parseInt(request.getHeader("DNT"))

       //获取日期类型的头

       //new Date(request.getDateHeader("date"));

      

    }

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //3.获取请求正文(post提交的数据)

       InputStream in = request.getInputStream();

       BufferedReader br = new BufferedReader(new InputStreamReader(in));

       System.out.println(br.readLine());

    }

 

}

 

 

4.3 应用场景

1)防盗链

   

//演示防盗链

public class RequestDemo2 extends HttpServlet {

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //解决输出中文问题

       response.setContentType("text/html;charset=utf-8");

             

       String msg = "";

       /**

        * 识别盗链

        */

       //获取referer请求头

       String referer = request.getHeader("referer");

       if(referer!=null && !referer.contains("http://localhost:8080/day09_02_request")){

           msg = "这是盗链,下次报警了";

       }else{

           msg = "芙蓉日记...";

       }

      

       response.getWriter().write(msg);

    }

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

 

}

 

2)获取和处理用户提交的数据

 

分两种情况:

GET方式;放在请求路径后面  -》  request.getQueryString()

POST方式:放在请求正文里面 -》 request.getInputStream()

 

通用(不分GET和POST)的获取用户提交数据的方法:

 

 

//演示获取用户提交的数据

/**

 * SUN公司的request对象设计了几个通用的获取用户数据的方法:(都是字符串类型)

 *    *String getParameter("name"): 获取一个指定名称的值

 *     *String[] getParameterValues("name")获取一个指定同名的多个值(多选)

 *     Enumeration getParameterNames()获取所有数据名称(只有名称)

 *     Map getParameterMap(): 获取所有数据(包含名称和值)

 * @author APPle

 *

 */

public class RequestDemo4 extends HttpServlet {

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //1.getParameter()

       String userName = request.getParameter("userName");

       System.out.println(userName);

      

       System.out.println("======");

       //2.getParameterValues()

       String[] hobby = request.getParameterValues("hobby");

       //Arrays.asList() 把数组转成集合,方便输出内容

       System.out.println(Arrays.asList(hobby));

      

       //3.getParameterNames()

       System.out.println("======");

       Enumeration enums = request.getParameterNames();

       while(enums.hasMoreElements()){

           String name = (String)enums.nextElement();

           //注意:如果遍历所有的数据,应该使用getParameterValues()获取,当做都是多个值的

           String[] value = request.getParameterValues(name);

           System.out.println(Arrays.asList(value));

       }

      

       System.out.println("======");

       //4.getParameterMap

       Map map = request.getParameterMap();

       Set<Entry> entrys = map.entrySet();

       for(Entry entry:entrys){

           String name = (String)entry.getKey();

           String[] value = (String[])entry.getValue();

           System.out.println(Arrays.asList(value));

       }

      

    }

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //调用doGet方法

       doGet(request,response);

    }

 

}

 


参数中文乱码问题

    POST解决办法:

       1)request.setCharacterEncoding("utf-8");

       2

       userName = newString(userName.getBytes("iso-8859-1"),"utf-8");

 

    GET解决办法:

       手动重新再次解码:

       userName = newString(userName.getBytes("iso-8859-1"),"utf-8");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                  

 

 

 

 

 

 

 

0 0
原创粉丝点击