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 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

文件上传

保证文件上传名称要唯一

posted @ 2020-07-02 21:38  wwwccc  阅读(280)  评论(0)    收藏  举报