一 请求对象和响应对象
1.1 HttpServletRequest(请求对象)
1.1.1 获取请求数据
public class requestDemo extends Servlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.请求行
request.getMethod();//请求方式
request.getRequestURI();//请求资源
request.getRequestURL();//请求的URL
//2.请求头
request.getHeader("Host");//根据头名称得到头内容
request.getHeaderNames();//得到所有的请求头名称列表
//3.保存数据 request是个域对象
request.setAttribute("name",Object obj);
request.getAttribute("name");
}
public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{
//请求实体内容
InputStream is = request.getInputStream();//只有post请求才有实体内容
}
}
1.1.2 获取Get和Post方式提交的参数
public class requestDemo1 extends Servlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getParameter("name");//根据参数名获取参数值
request.getParameterNames();//获取所有的参数名
request.getParameterValues("hobit");//获取一个参数名对应多个值的参数值
}
public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{
doGet(request,resp);
}
}
1.1.3 编码问题
如果客户端把字符串通过不是iso-8859-1的编码方式进行了编码后发给服务器,而服务器默认的解码方式是iso-8859-1,就会出现编码问题。
public class requestDemo2 extends Servlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");//根据参数名获取参数值
if("GET".equals(request.getMethod()))
{
name =new String(name.getBytes(),"utf-8"); //Get请求的编码问题解决方案
}
}
public void doPost(HttpServletRequest request, HttpServletResponse resp) throws servletException, IOException{
//设置参数编码 这个方法只对Post有效,对Get无效,要放在第一行
request.setCharacterEncoding("utf-8");
doGet(request,resp);
}
}
1.2 响应对象(HttpServletResponse)
public class responseDemo extends Servlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//可以设置响应头
response.setHeader("server","JBoss");
//响应的实体内容
response.getWriter().write("hello world");//字符内容
response.getOutputStream().write("hello world".getBytes());//字节内容
//设置请求重定向
response.sendRedirect("/it/test.html");
//定时刷新
response.setHeader("refresh","1");每隔1秒刷新一下当前页面
response.setHeader("refresh","3;url=/it/test.html");//隔三秒之后跳转到另外的资源
//服务器发送给客户端的数据类型和实体内容编码 但是要放在第一行
response.setContentType("text/html;charset=utf-8");
//response.setContentType("image/*"); 图片的格式类型
//设置以下载的方式打开文件
response.setHeader("Content-Disposition","attachment;filename="+"文件名称");
}
}
二 Servlet生命周期
public class ServletLife extends HttpServlet {
// 1.调用构造方法
public ServletLife ()
{
}
// 2.调用init方法 只会调用一次
public void init()
{
}
// 3.调用service方法 每次请求都会调用一次
public void service(ServletConfig config)
{
}
//4. 调用Destory方法 重新部署或者停止服务器时调用
public void destory()
{
}
}
生命周期:
- 通过映射找到web.xml中servlet-class的内容,字符串:”servlet.ServletLife “。
通过反射构造ServletLife 对象
Class clazz = class.forName(“servlet.ServletLife”);—-得到字节码对象
Object obj = clazz.newInstance();——调用了构造方法创建ServletConfig对象,通过反射调用init方法
Method m = clazz.getDeclareMethod(“init”,ServletConfig.class);—得到方法对象
m.invoke(obj,config);—-调用了init方法- 创建request,response对象,通过反射调用service方法
Method m = clazz.getDeclareMethod(“service”,HttpServletRequest.class,HttpServletResponse.class);—得到service方法对象
m.invoke(obj,request,response);—–调用service方法- 重新部署或者停止服务器时调用destory方法
Method m = clazz.getDeclareMethod(“destory”,null);—得到destory方法
m.invoke(obj,null);—-调用方法
三 Servlet使用小技巧
3.1 init方法
无参数的init方法是用来编写servlet初始化时要执行的逻辑代码。
3.2 提前加载servlet对象
如果init方法中的逻辑代码比较复杂,用户第一次访问servlet的时候会比较慢,可以把servlet的创建时机提前到web.xml加载的时候。
方法:在servlet的web.xml配置信息中,加上一个”load-on-startup”标签
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>c_life.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>
四 ServletConfig对象和ServletContext对象
4.1 ServletConfig
作用:主要用于加载servlet的初始化参数。
获取到ServletConfig对象:this.getServletConfig();
初始化参数配置在web.xml中
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/b.txt</param-value>
</init-param>
</servlet>
ServletConfig的API:
getInitParameter(java.lang.String name) //根据参数名获取参数值
getInitParameterNames() //获取所有参数
getServletContext() //得到servlet上下文对象
4.2 ServletContext(域对象)
ServletContext表示的是整个web应用的上下文,就是把应用的web.xml文件中的内容封装成了ServletContext对象。
得到方法:this.getServletContext();
获取web应用路径:
getContextPath();//获取到web应用的路径 重定向的时候用的多
获取web应用全局参数 要在web.xml中配置
getInitParameter(String name);//根据参数名获取参数值 web应用参数可以让当前web应用的所有servlet获取
getInitParameterNames()
保存数据和取出数据,可以在不同的servlet之间共享数据
setAttribute(String name,Object object);//保存数据
getAttribute(String name);//获取数据
removeAttribute(String name);//删除数据
转发—-不能转发当前web应用以外的资源
RequestDispatcher rd = this.getServletContext().getRequestDispatcher(String path);//用于跳转页面
rd.forward(request,response);
五 Web应用中路径问题
无论是web项目还是java项目(new File(“.”))中的“.”都是代表的java命令的运行目录。
5.1 转发或跳转资源路径确认
确认路径要先确认目标文件是给谁用的:
- 服务器使用:“/”表示在当前web应用的根目录(webRoot下)
- 浏览器/客户端使用:“/”表示在Tomcat文件中的webapps的根目录下
示例:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//目标资源:target.html放在WebRoot文件下面
//1.转发(服务器使用)
request.getRequestDispatcher("/target.html").forward(request,response);
//2.重定向(浏览器使用)
response.sendRedirect("/day11/target.html");
}
5.2 web应用中加载资源文件路径
getRealPath();返回资源文件的绝对路径
示例:
// db.properties文件放在项目的src文件夹下面
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");//第一个"/"代表项目根目录下
六 会话技术(Cookie和Session)
6.1 Cookie
特点:会话数据保存在浏览器客户端,主要作用是存储数据。
常用方法:
new Cookie(java.lang.String name, java.lang.String value);//创建一个cookie对象
void setPath(java.lang.String uri); //设置cookie的有效访问路径
void setMaxAge(int expiry) ;//设置cookie的有效时间 正数:cookie数据保存在浏览器硬盘中的时间 负数:cookie数据保存在浏览器内存中的时间 0:删除同名cookie
response.addCookie(Cookie cookie); //发送cookie到浏览器
request.getCookies();// 服务器接收cookie
注意:Cookie保存的数据类型只能是非中文字符串,一个站点最多存放20个cookie。
6.2 Session(HttpSession)—域对象
特点:会话数据保存在服务端。
常用方法:
request.getSession();//获取session对象
request.getSession(boolean create);//获取session对象
setMaxInactiveInterval(int interval);//设置session有效时间
invalidate();//销毁session对象
getId();//得到session编号
setAttribute(String name,Object value);//保存数据
getAttribute(String name);//获取数据
removeAttribute(String name);//清除数据