Servlet总结1
什么是servlet
- servlet是一门动态Web资源开发技术。
- servlet本质上是一段java程序,但是与java不同的是,servlet不能独立运行,需要把它放在服务器中运行(tomcat)。
- 其作用是处理服务器接收的请求
开发servlet程序
继承关系:
Servlet接口*--|GenericServlet抽象类 **--|HttpServlet抽象类 ***--|创建的servlet类
- 创建servlet程序
package cn.wl;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletDemo() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
可以使用以下格式:
package cn.wl;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
*/
public class ServletDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通过Eclipse创建的Servlet自动继承HttpServlet抽象类,而HttpServlet继承GenericServlet,GenericServlet继承Servlet接口,所以创建的Servlet实际上还是实现了Servlet接口。
继承HttpServlet类,默认会覆盖doGet和doPost方法。
- servlet的配置web.xml文件
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.tedu.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
两个标签中的servlet-name标签的内容要一致,
< url-pattern>是配置服务器以什么路径访问当前的servlet
创建web程序
- *注意: 3.0版本不会自动创建web.xml文件;选择2.5版本
web工程的目录结构
- ServletDemo:是工程的名称
- scr:是源码目录,创建java源文件,配置文件等
- build/classes :编译文件的输出目录,src源码目录下的源代码编译后保存在此目录下。classes目录中的文件会在项目发布时存放在WEB-INF目录下,随着项目一起发布到服务器上。
- WebContent: Web应用的目录,可以存放编译后的class文件、html、css、xml文件、lib依赖包等。项目的发布其实就是将WebContent中的内容发布到服务器上。
- lib:存放当前项目所以来的jar包。
requestresponse
request和response介绍
request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。
其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。
每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)
在请求处理完,响应结束时,服务器会销毁request和response对象。
request对象
- 请求参数
*即浏览器发送给浏览器的数据,比如通过表单提交的账号,密码等。 - 如何获取请求参数
request.getParameter(String pathname)
request.getParameters(String pathname) //获取一个数组
- 如何解决获取请求参数时的乱码问题
(1)如果是GET提交,tomcat8.0以后不会有中文乱码
(2)如果是POST提交,都会有中文乱码
可以用下面代码:
request.setCharacterEncoding("utf-8"); //只对POST有效
请求转发
- 请求转发是服务器内部的一种资源跳转方式,即当浏览器发出请求服务器的一个servlet A时,A将该请求转发给servlet B;由B处理后做出响应。
- 请求转发和重定向都是资源跳转方式,只是跳转的过程不同。
- Aservlet请求转发给Bservlet
package cn.wl.forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
* 请求转发
*/
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
System.out.println("Aservlet.doGet.....");
//从当前servlet转发到Bservlet
//dispatcher 派遣
request.getRequestDispatcher("BServlet").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
B
package cn.wl.forward;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.midi.Soundbank;
/**
* Servlet implementation class HelloServlet
*/
public class BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
System.out.println("Bservlet.doGet。。。。");
out.write("wdnmd"+new Date());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 请求特点:
*转发一次请求,一次响应
*网页不跳转
*能够携带资源
*请求前后的两个资源必须在同一个服务器
request对象
获取请求参数
- 什么是请求参数?
*请求参数就是浏览器发送给服务器的参数,方式有GET、POST等。比如提交表单等。
*格式如下:问号后面就是请求参数,使用&分开,可以是一个或多个;值或者是数组
http://loacalhost/day08-resreq/TestParam?name="张三"&age=12&interest="篮球"interest="足球"
- 怎么获取请求参数?
//格式
request.getParameter(String paramName);
request.getParameterValues(String[] paramName);
package cn.wl;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
*/
public class TestParam extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
/* 获取请求中的参数
* (1)需要保证浏览器发送请求Servlet时,请求中有参数
* (2)request.getParameter(String name);根据参数获得参数的值,存在多个值,只返回第一个
* (2)request.getParameterValues(String name); 值数组
*/
//获取请求中的username age
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println(username);
System.out.println(age);
String[] like = request.getParameterValues("like");
System.out.println(Arrays.toString(like));
out.write(username+"</br>");
out.write(age+"</br>");
out.write(Arrays.toString(like));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
解决获取请求参数时中文乱码的问题
- 1.如果是GET请求,tomcat8.0以后就不会有中文乱码问题
2.如果是POST请求,就一定会出现中文乱码问题
- 解决方法:在接收POST提交的中文参数时,设置为utf-8
request.setCharacterEncoding("utf-8");
3.如果是GET请求,并且tomcat是7.0以前的
- 解决方法:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8" />
作用域
使用request对象携带数据时,就是通过request对象中的map集合带数据,这个request对象和request对象的共享区域就称作作用域,这个作用域中的数据可以共享。
//向作用域存数据
request.setAttribute(String attrName, Object attrValue);
// 取数据
request.getAttribute(String attrName);
作用域的三大特征
- 1.生命周期:服务器在调用servlet中的service之前,会创建代表请求的request对象,在完成请求,响应结束以后,就会销毁request对象。
- 作用范围:在一次请求的范围内,获取的都是同一个request对象。
- 主要作用:和请求转发配合使用,将数据带到JSP(目的地)。
请求重定向
- 重定向也是资源跳转跳转方式
- 当浏览器向服务器发送获取请求资源A时,服务器通知浏览器需要再进一步请求才能获取资源,浏览器再次请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这就是重定向。
- 重定向的特点
*两次请求,两次响应
*重定向前后,网址变化
*不能携带数据
*重定向的资源可以不是同一个web应用
response对象
reponse是HTTP响应信息的对象
向客户端发送信息的中文乱码
respons在向客户端发送信息时,默认的编码是iso8859-1,这个编码没有中文字符,所有需要我们手动的设置:
//通知服务器响应数据时,使用utf-8,并且通知浏览器在接收数据时,也使用utf-8
response.setContentType("text/html;charset=utf-8");
代码实现
response.sendRedirect(所重定向的到url资源地址);
A
package cn.wl.forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
* 重定向
*/
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
System.out.println("CServlet.doGet()...的");
//1.从当前Servlet重定向到DServlet
//http://localhost:/day08-resreUJIq/CServlet
//http://localhost:/day08-resreq/DServlet
// response.sendRedirect("DServlet");
// response.sendRedirect("http://localhost:/day08-resreq/DServlet");
/*
* 2.从当前的Servlet重定向到day08-servlet/text.html
*/
// response.sendRedirect("http://localhost:/day08-servlet/test.html");
/*
* 3.从当前的Servlet重定向到百度
*/
response.sendRedirect("http://www.baidu.com");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
B
package cn.wl.forward;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServlet
*/
public class DServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); // 设置中文
PrintWriter out = response.getWriter();
System.out.println("吗");
out.write("我的");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结
请求转发和重定向的区别
1.请求转发是一次请求,一次响应;重定向是两次请求,两次响应
2.转发前后地址不变;重定向前后地址变
3.请求转发可以携带数据;重定向不可以
4.请求转发的两个资源必须在同一个web应用中;重定向可以不在
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。