字数
2601 字
阅读时间
11 分钟
一、重点知识
1.1 配置文件读取
在javaweb项目中配置文件也随着class文件一起储存在WEB-INF/classes文件中,与java项目不同,因此读取配置文件不能以磁盘路径读取,读取配置文件的方法由以下几种:
1.调用ServletContext的getRealPath(path)方法,将配置文件在服务器中的虚拟路径传入(虚拟路径即以webapps下的项目名为根目录),返回该配置文件的绝对路径。然后可通过字节流读取该文件,还可调用getResourceAsStream(path)方法,将虚拟路径传入,直接返回该配置文件的字节输入流对象
2.直接获得该Servlet类的类对象的类加载器。然后调用getResourceAsStream(path)方法;1.2 请求乱码
java
使用String对器进行重新编码 该方法不分请求方式
String username = new String(req.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
post提交方式
通过 setCharacterEncoding方法设置获取响应内容的格式,在获取数据之前进行修改格式 设置的字符集要和页面保持一致
URLEncoder.encode(str,"UTF-8");
get提交方式
通过 setCharacterEncoding方法设置获取响应内容的格式,在获取数据之前进行修改格式
在tomcat服务器的conf/server.xml中,在端口的Connector标签中添加 useBodyEncodingForURI=“true”1.3 cookie相关
java
//创建Cookie对象
Cookie c = new Cookie("String name","String value");
//设置有效期
// 负数:默认值,浏览器关闭时,cookie被销毁
c.setMaxAge(int seconds);
//设置有效路径
c.setPath(String uri)
//响应Cookie信息给客户端
resp.addCookie(c);
//Cookie的获取
//获取Cookie信息数组
Cookie[] cks = req.getCookies();
String getName() ;//获得名称 k
String getValue();// 获得值 v
setValue(java.lang.String newValue);//设置内容,用于修改key对应的value值
//一个Cookie对象储存一条数据,多条数据,可以多创建几个Cookie对象进行储存
// tomcat8之前存储中文可以通过url编码后存储,tomcat8支持中文,但不支持特殊字符。1.4 Session
Session的钝化和活化:
钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
钝化的数据路径为:
项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser活化:再次启动服务器后,从文件中加载数据到Session中
- 数据加载到Session中后,路径中的
SESSIONS.ser文件会被删除掉
- 数据加载到Session中后,路径中的
session的销毁会有两种方式:
默认情况下,无操作,默认30分钟自动销毁,在WEB.xml中配置 分钟数
xml
<session-config>
<session-timeout>100</session-timeout>
</session-config>直接销毁
java
// 销毁
session.invalidate();java
HttpSession session = request.getSession();
//2. 存储数据
session.setAttribute("username","zs");
//2. 获取数据
Object username = session.getAttribute("username");1.5 过滤器Filter
作用:对服务器接受的请求资源和响应给浏览器的资源进行管理。保护servlet
执行流程:dofilter放行方法前逻辑-> 放行访问资源-> 放行方法后逻辑优先级是按照过滤器类名(字符串)的自然排序
过滤器链:多个过滤器组成的过滤链。注解配置Filter
使用
java//实现Filter接口,配置Filter拦截资源的路径:在类上定义 `@WebFilter` 注解。而注解的 `value` 属性值 `/*` 表示拦截所有的资源 // 重新init方法 服务器启动即执行。资源初始化 void init(){} // 重写doFilter方法 拦截请求,需手动放行 //放行: chain.doFilter(request, response); // destory方法: 服务器关闭执行。 //需在web.xml中配置 <filter> <filter-name>demo1</filter-name> <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping> <dispatcher>资源被访问的方式</dispatcher> 拦截方式配置:资源被访问的方式 * 注解配置: * 设置dispatcherTypes属性 1. REQUEST:默认值。浏览器直接请求资源 2. FORWARD:转发访问资源 3. INCLUDE:包含访问资源 4. ERROR:错误跳转资源 5. ASYNC:异步访问资源生命周期
当服务器启动后,实例化过滤器,调用init方法进行初始化。 当客户端发送一次请求,就调用一次过滤器中doFilter方法进行过滤 要么是放行:chain.doFilter(req,resp); 要么不放行:不写 当服务器关闭的时候,过滤器销毁,调用destory方法进行资源回收
1.5 监听器
作用:监听作用域对象request、session、application的创建、销毁和内容的改变时自动执行代码的功能组件
内置监听器
监听器分类 监听器名称 作用 ServletContext监听 ServletContextListener 用于对ServletContext对象进行监听(创建、销毁) ServletContextAttributeListener 用于对ServletContext对象中属性的监听(增删改属性) Session监听 HttpSessionListener 对Session对象的整体状态的监听(创建、销毁) HttpSessionAttributeListener 对Session对象中的属性的监听(增删改属性) HttpSessionBindingListener 监听对象于Session的绑定和解除 HttpSessionActivationListener 对Session数据的钝化和活化的监听 Request监听 ServletRequestListener 对Request对象进行监听(创建、销毁) ServletRequestAttributeListener 对Request对象中属性的监听(增删改属性) 使用
java//监听request //ServletRequestListener requestInitialized(ServletRequestEvent sre);//创建 requestDestroyed(ServletRequestEvent sre);//销毁 //形参可以获取监听的request对象 sre.getServletRequest(); // 监听request作用域数据的变更。 //ServletRequestAttributeListener attributeAdded(ServletRequestAttributeEvent srae);//新增 attributeRemoved(ServletRequestAttributeEvent srae);//移除 attributeReplaced(ServletRequestAttributeEvent srae);//修改 //注意:形参可以获取被监听的数据 //srae.getName() 获取监听数据的键 //srae.getValue() 获取监听数据的值 //监听session的创建和销毁 //HttpSessionListener //sessionCreated(HttpSessionEvent se);//创建 //sessionDestroyed(HttpSessionEvent se); //销毁 //注意:形参可以获取被监听的session对象 //se.getSession(); // 监听session数据的变更 //HttpSessionAttributeListener attributeAdded(HttpSessionBindingEvent event);//新增 attributeRemoved(HttpSessionBindingEvent event);//移除 attributeReplaced(HttpSessionBindingEvent event);//修改 //注意:形参可以获取被监听的数据 //event.getName() 获取数据的键名 //event.getValue() 获取数据的值 //监听HttpSession中的属性的状态(javabean) //HttpSessionBindingListener valueBound(HttpSessionBindingEvent event);//创建 valueUnbound(HttpSessionBindingEvent event);//销毁 //只有实现了HttpSessionBindingListener的类,在和session绑定、解除绑定时触发其事件。 //监听session的序列化和反序列化 //HttpSessionActivationListener sessionWillPassivate(HttpSessionEvent se);//钝化(序列化) sessionDidActivate(HttpSessionEvent se);//活化(反序列化) //监听application对象的初始化和销毁 //ServletContextListener contextInitialized(ServletContextEvent sce);// 初始化 服务器启动 contextDestroyed(ServletContextEvent sce);//销毁 服务器关闭 //注意: //形参可以获取当前application对象。 //sce.getServletContext(); // 监听数据的变更 //ServletContextAttributeListener attributeAdded(ServletContextAttributeEvent event);//新增 attributeRemoved(ServletContextAttributeEvent event);//移除 attributeReplaced(ServletContextAttributeEvent event);//修改 //注意:形参可以获取当前监听的数据 //event.getName() 获取数据的键名 //event.getValue() 获取数据的值在web.xml中配置
xml<listener> <listener-class>类的全路径</listener-class> <!--指定初始化参数<context-param>--> </listener>自定义监听器
java// 实现监听器接口 ServletContextListener // 重写抽象方法 // 在web.xml中配置或 添加@WebListener注解
1.6 Request
requestapi
java// http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123 /** * request 获取请求数据 */ @WebServlet("/req1") public class RequestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // String getMethod():获取请求方式: GET String method = req.getMethod(); System.out.println(method);//GET // String getContextPath():获取虚拟目录(项目访问路径):/request-demo String contextPath = req.getContextPath(); // 获取Servlet路径 req.getServletPath(); System.out.println(contextPath); // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1 StringBuffer url = req.getRequestURL(); System.out.println(url.toString()); // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1 String uri = req.getRequestURI(); System.out.println(uri); // String getQueryString():获取请求参数(GET方式): username=zhangsan String queryString = req.getQueryString(); System.out.println(queryString); //获取协议及版本:HTTP/1.1 req.getProtocol(); //获取客户机的IP地址: req.getRemoteAddr(); //获取请求头: user-agent: 浏览器的版本信息 String agent = req.getHeader("user-agent"); System.out.println(agent); //1. 获取所有参数的Map集合 Map<String, String[]> map = req.getParameterMap(); for (String key : map.keySet()) { // username:zhangsan lisi System.out.print(key+":"); //获取值 String[] values = map.get(key); for (String value : values) { System.out.print(value + " "); } System.out.println(); } String[] hobbies = req.getParameterValues("hobby"); for (String hobby : hobbies) { System.out.println(hobby); } //... String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username); System.out.println(password); // 获取服务器内部转发参数 //存储数据 request.setAttribute("msg","hello"); //请求转发 // request.getRequestDispatcher("/req6").forward(request,response); //获取数据 Object msg = request.getAttribute("msg"); System.out.println(msg); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取post 请求体:请求参数 //1. 获取字符输入流 // BufferedReader流是通过request对象来获取的,当请求完成后request对象就会被销毁,request对象被销毁后,BufferedReader流就会自动关闭,所以此处就不需要手动关闭流了。 BufferedReader br = req.getReader(); //2. 读取数据 String line = br.readLine(); System.out.println(line); } }
1.7 Response
java
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp1....");
//重定向
//1.设置响应状态码 302
response.setStatus(302);
//2. 设置响应头 Location
response.setHeader("Location","/request-demo/resp2");
//重定向
resposne.sendRedirect("/request-demo/resp2");
// 获取项目目录
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
// 返回响应的html数据
// Content-disposition 服务器告诉客户端以什么格式打开响应体数据
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("aaa");
// 返回字节流数据
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff))!= -1){
os.write(buff,0,len);
}
fis.close();
// 工具类简写
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
// content-disposition:attachment;filename=xxx 指定浏览器打开为下载和文件名称
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
IOUtils.copy(fis,os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}1.8 Servlet
servlet实现:继承Servlet方法,实现抽象方法,在web.xml中配置,或通过@WebServlet("资源路径")注解实现
xml
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>**生命周期:**方法有三个:
init方法
service方法
destroy方法
流程:
默认情况下第一次访问被创建(可以配置创建时机,<load-on-startup>为负数,第一次访问时创建,为0或正整数在服务器启动时创建):执行init方法,只执行一次,Servlet在内存中只存在一个对象,Servlet是单例的。
提供服务时执行service方法,每次被访问时都会调用一次。
服务器关闭时,servlet被销毁,执行destroy方法,一般用于释放资源。