servlet2见解

一.如何解决编码问题 (相当于过滤器)第一个hashMap
		//解决因提交方式不同的参数编码问题
		resp.setContentType("text/html;charset=GBK");
		PrintWriter out=resp.getWriter();
		String method=req.getMethod();
		if("post".equalsIgnoreCase(method)){
			req.setCharacterEncoding("GBK");
		}else if("get".equalsIgnoreCase(method)){
			Map map=req.getParameterMap();//得到一个参数的hashMap集合
			Set setmap=map.keySet();	  //得到集合中的键,返回一个set集合
			Iterator it=setmap.iterator();//再进行迭代
			while(it.hasNext()){          //将迭代循环
				String key=(String)it.next(); //取得迭代中的键
				String[] values=(String[])map.get(key); //通过键取值
				
				for(int i=0;i<values.length;i++){
					byte[] buff=values[i].getBytes("iso8859-1");//反编码
					values[i]=new String(buff,"GBk");//编码后转码
					
				}
			}
 
		String name=req.getParameter("uname");
		out.println("欢迎您:"+name);

二、通过request得到请求头的方法,第二个hashMap
		//得到Request的一些常用请求头的方法
		//resp.setContentType("application/vnd.ms-excel;charset=GBK");
		//application/vnd.ms-excel是excel表单的方式打开,还可以设置为其他客户端浏览器所支持的 
           格式
		resp.setContentType("text/html;charset=GBK");
		req.setCharacterEncoding("GBK");
		PrintWriter out=resp.getWriter();

         //只有HttpServletRequest在可以得到头信息
		HttpServletRequest request=(HttpServletRequest)req;		
         Enumeration enums=request.getHeaderNames();//得到请求头的一个枚举
		out.print("<table border='1'>");//以表格的方式打印出来	
	    while(enums.hasMoreElements()){//是否有更多的元素
			out.print("<tr>");
			String key=(String)enums.nextElement();//从枚举中取得键
			String value=request.getHeader(key); //通过键取值
			out.print("<td>"+key+"</td>");
			out.print("<td>"+value+"</td>");
			out.print("</tr>");
		}
		out.print("</table>");
	}

三、通过request得到所有属性的方法,第三个hashMap
		PrintWriter out=resp.getWriter();
		//将请求转为 Http的请求
		HttpServletRequest request=(HttpServletRequest)req;
		//得到Request中所有的属性 返回一个枚举类型
		Enumeration enums=request.getAttributeNames();
		//看枚举中是否有元素
		while(enums.hasMoreElements()){
			//从枚举中把键取出来
			String key=(String)enums.nextElement();
			//通过键取的值
			Object value=request.getAttribute(key);
			out.print(key+":"+value+"<br>");
		}

         注意:会有tomcat已经设好的三个值
javax.servlet.forward.request_uri	/WebTest/page1.jsp	
javax.servlet.forward.context_path	/WebTest	
javax.servlet.forward.servlet_path	/page1.jsp	
         



       
四、	得到session,application
      HttpServletRequest request = (HttpServletRequest)req;
		String n1 = (String)request.getAttribute("name");
		System.out.println("request:"+n1);
		
		//得到session
		HttpSession session = request.getSession();
		String n2 = (String)session.getAttribute("name");
		System.out.println("session:"+n2);
		
		//得到application
		//ServletContext application = session.getServletContext();
		//用此方法只有再继承了httpservlet类或 GenericServlet类才有
		//ServletContext application = this.getServletContext();
		ServletContext application=this.getServletConfig().getServletContext();
		
		String n3 = (String)application.getAttribute("name");
		System.out.println("application:"+n3);

 五.  ServletConfig和ServletContext的区别
        ServletConfig记录着单个服务员的信息,比如说年龄,性别等
        ServletConfig只能获得自己的servlet信息配置信息
        比如:以前获取编码参数的问题等
     <servlet>
       <servlet-name>hello7</servlet-name>
       <servlet-class>com.accp.servlet.Hello7</servlet-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>text/html;charset=GB18030</param-value>
       </init-param>
       <init-param>
           <param-name>sex</param-name>
           <param-value>男</param-value>
       </init-param>
       <init-param>
           <param-name>age</param-name>
           <param-value>女</param-value>
       </init-param>
   </servlet>
   <servlet-mapping>
        <servlet-name>hello7</servlet-name>
        <url-pattern>/hello7</url-pattern>
   </servlet-mapping>

  Service()方法中
       //ServletConfig使用,拿到Hello7这个servlet单独的信息
       //拿到所有servlet所有参数名
		Enumeration configs = this.getServletConfig().getInitParameterNames();
		while(configs.hasMoreElements()){
			String key=(String)configs.nextElement();
             //根据参数名拿参数值
			String value = this.getServletConfig().getInitParameter(key);
			System.out.println(key+"--"+value);	
		}

        但是我们发现以前每个servlet都要有编码问题的设置,那我们能不能配置一个公有的,让每一个
        Servlet都享有
         
        其实可以配置一个公有信息
        <context-param>
           <param-name>encoding</param-name>
           <param-value>text/html;charset=GB18030</param-value>
       </context-param>
       问题是在servlet中怎么获取这些公共的信息?

        ServletContext记录着整个这个门店的信息,也就是服务员工作坏境的信息。比如墙壁是刷成什么颜
        色等
        ServletContext保存着整个公共的配置信息
              
        //ServletContext使用,拿到整个公共的配置信息
		Enumeration contexts =this.getServletContext().getInitParameterNames();
		while(contexts.hasMoreElements()){
			String key=(String)contexts.nextElement();
			String value = this.getServletContext().getInitParameter(key);
			System.out.println(key+"--"+value);	
		}


六.利用ServletContext,读取WEB-INF目录下的客户端不可读文件	
	    	resp.setContentType("text/html;charset=GBk");
		PrintWriter out=resp.getWriter();
		ServletContext sct=this.getServletContext();
		//获取到文件资源,并将它转为文件流(相对路径)
		InputStream in=sct.getResourceAsStream("/WEB-INF/abc.html");
		Reader read=new InputStreamReader(in);//转为字符流
		BufferedReader reader=new BufferedReader(read);//改为包装流
		String str=reader.readLine();//读取
		while(str!=null){
			out.print(str);//打印
			str=reader.readLine();
		}
		
		reader.close();
		read.close();
  	in.close();


 
      //jsp转发Servlet
     // pageContext.forward("Test7");
     //jsp重定向到Servlet
     //response.sendRedirect("Test7");

	//servet转发到jsp
	//request.getRequestDispatcher("/page3.jsp").forward(request, response);

	//servet重定向到jsp
	String path = request.getContextPath();
	System.out.println(path);
	response.sendRedirect(path+"/page3.jsp");
    
    



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值