Java web在服务器和浏览器之前运行的Java类被称为Servlet,以下记录目前接触过的常见的的Servlet方法
Tomcat服务器调用的唯一方法,即使是doGet方法和doPost方法,也只不过是在super.service()当中,判断一下当前是用什么method调用的。服务器只认service方法,无论使用post还是get来获取网页。
resp.setContentType("text/html;charset=utf-8");
设置输出在浏览器网页上文本的格式,告诉浏览器以何种形式来对文本进行解析。此命令会在请求头当中新增一个Content-Type: text/html;charset=utf-8的属性键值对。此方法解决了中文打印在浏览器发生乱码的问题
resp.getWriter().write("Hello World");
服务器向浏览器页面上打印文字的方法,所有的网页都是由这个方法一行一行打出来的。
req.setCharacterEncoding("utf-8");
设置Tomcat服务器对接收来自浏览器请求的编码格式,此方法解决了接收浏览器的中文信息在服务器上乱码的问题。该方法对post和get方法都适用。之后所有的接受的请求,服务器都会按照utf-8的格式解析。
使用String重新编码,该方法解决了一句话当中的中文乱码问题。
从前端的form表单当中接收的信息的方法
请求转发的方法,此方法可以使其他的Servlet执行而不改变页面网址,相当于把别的Servlet变成一个方法拿过来调用。
由于请求转发的方法没有传递参数的形参位置,如果请求转发的过程当中,需要向转发的Servlet传递信息的时候,需要使用此方法将参数的键值对加入到request对象当中。request.getAttribute(Object obj)方法可以提取出对应的属性
重定向方法,该方法可以真正意义上运行一个Servlet请求,就连网址也会发生变化,但是因为是新的请求,原来的request对象没有办法跟到这里,要是想要上一次请求的数据,需要session和cookie的协助
新增Cookie:
Cookie c = new Cookie("uname", uname);
resp.addCookie(c);
此方法可以新增一条临时cookie数据,在关闭浏览器之前会一直保存(存储在浏览器的内存当中)。新建cookie信息会在http的响应头当中体现出来。存储的cookie信息会在请求头当中出现。
c.setMaxAge(24*60*60);
将Cookie存储到硬盘当中,暂时不会随着关闭浏览器而数据消失,默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径
c.setPath("/Login/main");
Cookie cks[] = req.getCookies();
String uname = new String();
if (cks!=null)
{
for (int i = 0 ;i<cks.length;i++)
{
if (cks[i].getName().equals("uname"))
uname = cks[i].getValue();
}
}
需要注意的是,如果当前页面的request当中不存在cookie,getCookies()方法返回的是null,在对cookie进行操作之前记得要判断是否是空值。
HttpSession hs = req.getSession();
Tomcat已经将session的流程进行了完全的封装,这一句指令当中即是获取session对象,又是创建session对象,取决于当前浏览器的cookie是否存在JSESSIONID这一行键值对。如果存在,则返回其对应的session对象,请求中没有标识符也就是创建session对象。JSESSIONID只存储在浏览器内存当中,关闭浏览器会失效。
服务器中session默认存储时间是30分钟,不过可以设置session的存在时间。(这也解释了为什么在OJ做题的时候,太久不操作页面会自动掉线,其实是session到期了)。
如果在session存在时间内,对服务器进行了操作,session消失时间会被重置。
hs.setMaxInactiveInterval(arg0);//设置session对象在服务器的保存时间
hs.invalidate();//立即销毁session
ServletContext sc = this.getServletContext();
ServletContext sc2 = this.getServletConfig().getServletContext();
ServletContext sc3 = req.getSession().getServletContext();
三种创建方式都可以
和session不同,session用于存储同一用户的不同请求的数据,而ServletContext更像是一个存于服务器的全局变量,不同的用户都可以对ServletContext数据进行存取。
sc.getInitParameter(String name); //根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
sc.getInitParameterNames();//返回键名的枚举
如果数据不存在返回null。
配置方式:注意 一组标签只能存储一组键值对数据,多组可以声明多个进行存储。
<context-param>
<param-name>nameparam-name>
<param-value>zhangsanparam-value>
context-param>
String path=sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
InputStream is = sc.getResourceAsStream(String path);
/** 注意:
* 此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
* path参数为项目根目录中的路径
*/
ServletContext可以很轻松的读取web.xml文件当中的全局信息,如果想读取只针对于该Servlet的内容,则需要ServletConfig对象进行读取。
Servlet在web的局部对象写法(内容必须写到与其对应的servlet标签当中):
<init-param>
<param-name>configparam-name>
<param-value>utf-8param-value>
init-param>
局部数据在Servlet读取的方法:
ServletConfig sc = this.getServletConfig(); //创建ServletConfig对象
String code=sc.getInitParameter("config");