您的位置:首页 > 编程语言 > Java开发

javaee之servlet的方法详解

2016-07-20 00:26 483 查看

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");


 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

                  

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ee