Servlet复习
Servlet
Java Web Java EE
创建web工程
src -> 源码
-
Servlet -> extends HttpServlet Servlet是单例的,非线程安全的
- doGet() 处理get请求
- doPost() 处理post请求
生命周期 -》构造器 init service destroy
这个Servlet被第一次访问的时候
创建当前Servlet对象-》构造器-》init完成初始化-》service(doGet/doPost)->destroy
第二次访问的时候,
service(doGet/doPost) 处理请求,依次类推
webapp 用于存放jsp以及html css js 图片等资源文件
-
WEB-INF 这个目录是受保护的目录,不允许在浏览器地址栏中直接访问(重定向或者地址栏中直接输入)该目录下的内容
http://localhost:8080/demo/WEB-INF/index.jsp,所以我们只能通过转发来访问该目录下的内容,转发地址拦内容不会变化-
web.xml 可用于配置Servlet地址资源匹配,过滤器拦截以及监听器配置
-
/* 拦截所有
-
*.do(后缀) 拦截所有.do结尾的请求
-
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.cx.controller.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
注解与xml配置效果相同
@WebServlet(name = "CodeServlet", urlPatterns = "/code.action") -
-
GET/POST
各自的特点与区别
1.传递参数,get会将参数拼接在地址拦中,不安全,Post参数封装在request body中
2.get方式传递参数有大小限制......,post无限制
3.......
HttpServletRequest
请求对象,域对象(在多个Servlet之间页面之间传递数据)
getParameter(String name)方法 # 获取单个name的input标签的值
getParameterValues(String name)方法 # 用于获取多个name相同的input标签的值,如checkbox
了解
request对象通过以下方法来获取请求路径,如下所示:
String getServerName():获取服务器名,localhost;
String getServerPort():获取服务器端口号,8080;
String getContextPath():获取项目名,/Example;
String getServletPath():获取Servlet路径,/AServlet;
String getQueryString():获取参数部分,即问号后面的部分:username=zhangsan
String getRequestURI():获取请求URI,等于项目名+Servlet路径:/Example/AServlet
String getRequestURL():获取请求URL,等于不包含参数的整个请求路径:http://localhost:8080/Example/AServlet
转发
状态码 307
转发前后地址栏 不变
转发行为是发生在服务器内部的行为
转发前后是同一对Request与Response对象
request.getRequestDispatcher("").forward(request,response);
HttpServletResponse
请求响应,响应数据返回到浏览器显示
response.getWriter().write(..........) // 写回浏览器
重定向
状态码 302
response.sendRedirect("/.....")
重定向前后地址栏 变化
重定向行为是发生在服务器内部以及服务器之间的行为
重定向前后是Request与Response对象不是同一对
其他状态码
404 500 200
400 bad request,请求报文存在语法错误 请求参数有问题
ServletContext
WEB容器在启动时,每个WEB应用程序都会创建一个对应的ServletContext对象,它代表当前web应用,只有一个,存在于程序运行的始终。
应用级别,可以在所有Servlet之间共享数据
load-on-startup
在启动时加载,默认情况下,Servlet在第一次被访问的时候才会加载初始化,当Servlet配置上这个属性之后,就意味着该Servlet会在应用启动时加载,即创建该对象并初始化。
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>类全名</servlet-class>
<load-on-startup>2</load-on-startup>数值小的先加载/正整数
</servlet>
Cookie
客户端技术 ,因为其数据保存在浏览器中,默认生命周期是一次会话
保存一系列文本信息 ,不能直接保存中文
Cookie newCookie=new Cookie("parameter", "value");
response.addCookie(newCookie);// 写入到浏览器
当前地址下,保存的Cookie数据在每次请求服务器时,都会将他们发送到服务器
setMaxAge(int expiry) 单位 秒 Cookie的有效期
cookie.setMaxAge(0)删除同名Cookie
安全性能:容易信息泄露
HttpSession
服务端技术,因为其数据保存在服务器中,即服务器的内存中,默认生命周期是一次会话
域对象---会话间在多个servlet与jsp之间传递数据
session.setAttribute(key,Object) session.getAttribute(key)
session.removeAttribute(key)
key -> String
session.setMaxInactiveInterval(时间) 设置最大交互时间,登录之后,如果一段时间没有进行操作,那么会导致session失效,重新登陆
session.getMaxInactiveInterval()
session.invalidate() sesssion 失效
session.getId() Session ID,在session对象创建时,服务器为session对象分配的唯一值,标识这个session对象,不同的session,ID则不同。
过滤器(Filter)
implements Filter
随着应用启动而初始化 init 拦截作用
浏览器有个请求到达服务器-》
检查是否符合过滤器的URL匹配规则-》如果符合,执行过滤器的doFilter,如果不符合,正常执行-》该方法有个参数FilterChain过滤器链,如果调用了这个过滤器链的doFilter方法,就进行放行操作,即通过这个过滤器,如果后面还有其他过滤器,重复如上操作,如果没有其他过滤器了,就访问到其目标资源(jsp/html/servlet/js等等Servlet以及webapp下的资源)
如果经过过滤器,没有调用doFilter方法,就进行拦截,不会到达访问的目标资源
Filter执行顺序是先xml中按顺序在按照注解中字符顺序
应用场景:请求响应乱码解决
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);// 放行
}
每次请求经过过滤器,只会执行如上doFilter方法
@WebFilter(filterName = "CharsetFilter",
urlPatterns = "/",/通配符()表示对所有的web资源进行拦截/
initParams = {
@WebInitParam(name = "charset", value = "utf-8")/这里可以放一些初始化的参数/
})
监听器
监听域对象的创建 销毁 属性添加 修改 删除(attribute)
ServletRequest HttpSession ServletContext
ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
ServletContext 应用启动时创建, contextInitialized 方法
Servlet中主要有三种监听器,对于Request、Session、Context三种域来说都存在,比如ServletContextListener用于监听ServletContext对象的创建和销毁事件,ServletContextAttributeListener用来监听其属性变化,还有一些自我状态感知监听器比如HttpSessionBindingListener实现接口的java对象感知自己被绑定到Session或者从Session中解绑。 HttpSessionActivationListener实现接口的java对象,感知从内存被钝化硬盘上,雅思托福的区别从硬盘活化到内存中 实现这两个接口的类不需要 web.xml 文件中进行注册,都是由Session自主完成的,例如在存储对象的时候会自动调用绑定
监视器参考:https://www.cnblogs.com/zhangyanran/p/10082180.html
文件上传
保证文件上传名称要唯一

浙公网安备 33010602011771号