有幸选到了被称为东北java第一人姜国海老师的j2ee课,就开设一个板块,做一些笔记,这个板块就用来做Servlet笔记。
Servlet:
Servlet可以被理解为运行在服务器段的小程序,Servlet是一个接口,这个接口下需要实现的方法有
1、void destroy() servlet的销毁方法
2、ServletConfig getServletConfig() 获取Servlet配置 这个配置写在web.xml中,用<init-param><param-name>name</param-name> <param-value>value</param-value></init-param> 以name-value的形式进行配置。
3、String getServletInfo() 获取Servlet的信息。老师说这个函数基本上没啥用..
4、void init(ServletConfig config) throws ServletException 这个函数进行Servlet的初始化,实现的时候至少需要写this.config = config;
5、void service(ServletRequest request , ServletResponse response) throws ServletException, IOException 这里进行Servlet的业务逻辑书写。
HttpServlet是实现了Servlet的类
HttpServlet中默认情况下,无论是get还是post提交过来都会经过service()方法进行处理,然后转向doGet()方法或者doPost()方法,这在其service()方法源码中有体现:
String method = req.getMethod();//获取数据传输方法
if(method.equals("GET")){
//to do... 中间就调用了doGet()方法
}
//以及对于其他传输方法的处理
继承了这个类的类一般内部不写成员变量,因为线程不安全。
也可以implements SingleThreadModel,来使得一个时刻最多只有一个线程在执行或者也可以用synchronized实现线程安全,但是效率很低,而且SingleThreadModel快被废弃了。
HttpServletRequest:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
对于一个HttpServletRequest对象request,常用方法有下:
1、request.setContentType("text/html;charset=utf-8");
2、request.getQueryString();//返回url中的查询字符串 url中?后面那一串 比如www.test.html?id=1 id=1就是查询字符串
3、request.getParameter(String name);//获取请求中的参数数据name这个参数对应的value 比如对于上面那个url,request.getParameter("id");返回值就是1;
4、request.getParameterNames();//返回名的枚举 可以通过枚举的遍历方式进行遍历 不做赘述
5、request.getParameterValues(String name);//返回一个String数组 因为前台传输过来可能有多个相同name的name-value对;
6、request.getCookies();//获得所有cookies,返回结果是一个Cookie数组Cookie[];
7、request.getSession();//获得session,返回结果是HttpSession类型 session.getId()可以获取sessionID,只要传输sessionID就可以session对应的作用,传输sessionID的方法一般有cookie(最常用)、url rewriting(用到response.encodeURL(String url))、隐藏域提交(使用一个隐藏的form表单进行提交);
8、request.getAttribute(String name)/request.setAttibute(String arg0,String arg1);//读取/设置请求中的名值对
HttpServletResponse:
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。对于HttpServletResponse类型的对象response,常用方法如下:
1、response.setContentType(String arg0);//设置ContentType
contentType:用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件;
2、response.setHeader(String arg0,String arg1);//设置响应头
3、response.getWriter();//获取文本输出打印流 返回类型是PrintWriter 一般使用之后不会调用PrintWriter方法进行关闭,因为那样会导致其他想访问这个组件的程序无法正常运行;
6、response.addCookie(Cookie cookie); //添加一个cookiecookie和session的作用及其区别看这里
7、response.encodeURL(String url)//重写url 后面跟上jsessionid=标识这次会话的一串字符串
除cookie外跟踪 Session 的一种另机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。这就是重写url来传输Session ID的方法;
HttpSession:
HttpSession表示一个会话,我们可以把一次会话所需要的共享数据放到一个HttpSession中,对于这个类的对象session有以下常用方法:
1、session.setAttribute(String arg0,String arg1);//设置session中的名值对
2、session.getAttribute(String name);//获取session中对应名name的值
3、session.removeAttribute(String name);//移除session中name对应的域属性,如果这个域属性为null 则什么都不做
4、session.getAttributeNames();//获取session中所有名的枚举,用正常遍历枚举(Enumeration)的方法遍历即可;
5、session.getId();//获取sessionID 标识当前会话的值
6、session.setMaxInactiveInterval(int arg0);//超过arg0秒就释放这个session
7、session.invalidate();//将session置为失效
ServletContext:
是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。一个用户可以有多个request,有一个session,但是ServletContext所有用户只能有一个,所以这里面的东西是所有用户都共享的,重要的,线程安全的信息。使用getServletContext()方法可以获取这个ServletContext实例sc,这是单例。常用方法如下:
1、sc.getInitParameter(String name) //获取初始化参数
2、sc.getInitParameterNames() 前者 //获取初始化参数中所有名name的枚举
3、sc.getAttribute(String name) //sc.setAttribute(String name,String value)//获取name对应的值/设置名值对
4、sc.removeAttribute(String name) //删除sc中name对应的域属性,没有则什么都不做
5、sc.getRealPath(String fileName) //获取fileName对应的真实路径
RequestDispatcher:
请求派发器,一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。
创建实例的方法:
RequestDispatcher rd = getServletConfig().getServletContext().getRequestDispatcher(String arg0);//参数为派发地址
简单来说这个类的实例rd常用的有两个方法:
1、rd.include(HttpServletRequest request, HttpServletResponse response);//相当于把新的资源包括到当前响应中
2、rd.forward(HttpServletRequest request, HttpServletResponse response);//转发请求
web.xml:
web.xml文件是用来初始化配置信息,有的可以用注解来实现,介绍一些课上讲的标签:
<web-app>
<servlet>
<servlet-name>servlet的名字</servlet-name>
<servlet-class>servlet对应的类的全称</servlet-class>
<init-param>
<param-name>配置参数的name</param-name>
<param-value>这个name对应的value</param-value>
</init-param><!-- 为这个servlet配置name value名值对 可以通过ServletConfig实例的getInitParameter(String name)获取到 -->
</servlet><!-- 配置一个servlet -->
<servlet-mapping>
<servlet-name>之前设置好的name</servlet-name>
<url-pattern>自己设定的url</url-pattern>
</servlet-mapping><!-- 设置servlet和url的映射关系 通过这个url就可以访问到这个servlet -->
</web-app><!-- 在一个web-app标签之内 -->
Filter:
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源。
Filter是一个声明了以下方法的接口:
1、void destroy();//filter销毁
2、void init(FilterConfig config);//filter初始化
3、void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;//最重要的函数 在这里进行过滤
doFilter(request,response,chain)方法可以视为这样工作:
- 调用目标资源之前,让一段代码执行。
- 是否调用目标资源(即是否让用户访问web资源)。//chain.doFilter(request,response);这条代码是分水岭 这之前处理请求对象,之后处理响应对象
- 调用目标资源之后,让一段代码执行。
先告一段落...未完待续