一.如何解决编码问题 (相当于过滤器)第一个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");
servlet2见解
最新推荐文章于 2024-01-01 17:21:12 发布