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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树