1、 为什么需要Servlet
1.1、在JSP技术出现之前,如何使用Java语言来编写Web程序。
在JSP技术出现之前,如果想生成HTML页面,那就只有在服务器端运行Java程序,并输出(打印)HTML格式内容。运行在服务器端的Java程序就是Servlet。
1.2、 什么是Servlet。
Servlet是一个Java程序,是在服务器端运行以处理客户端请求并做出响应的程序。
Servlet示例代码:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//继承自HttpServlet
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//设定输出内容为HTML,字符集为中文
response.setContentType("text/html;charset=gb2312");
//使用打印输出流,向客户端输出信息
PrintWriter out = response.getWriter();
out.println("<html>");
out.println(" <head><title>Servlet</title></head>");
out.println(" <body>");
out.println("Servlet你好啊!我是新新!");
out.println(" </body>");
out.println("</html>");
out.close();
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doGet(request,response);
}
}
1.3、Servlet与JSP之间的关系。
xinxin.jsp在运行时首先解析成一个Java类xinxin_jsp.java,该类继承于org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase又是继承自HttpServlet的类,可见JSP在运行前首先将编译为一个Servlet,由此可见Servlet是JSP的基础。
2、 如何创建Servlet
使用向导创建Servlet:
右键,新建--->Servlet命令,输入Servlet名称,选择超类为javax.servlet.http.HttpServlet,并选中Create doGet和Create doPost两个复选框,单击“完成”按钮。
手写Servlet:
创建类继承HttpServlet。
重写doGet(),doPost()方法,init()。
写web.xml。
3、 form表单的提交方法有两种,相应地在Servlet中也提供了两种接收请求数据的方法,但是如何能保证提交的方法和接收的方法都能对应上呢,把处理代码写在doGet()方法中,之后在doPost()方法中调用doGet()方法,这样就能保证客户端使用什么方法提交请求,程序都能正确地接收到数据。
4、 Servlet的生命周期。
4.1、加载和实例化
Servlet容器负责加载和实例化Servlet,当客户端发送一个请求时,Servlet容器会查找内存中是否存在Servlet实例,如果不存在,就创建一个Servlet实例。如果存在Servlet实例,就直接从内存中取出该实例来响应请求。
Servlet容器有时候也叫做Servlet引擎,是Web服务器或应用服务器的一部分,用于在发送的请求和响应之间提供网络服务。例如:Tomcat。
4.2、初始化
Servlet容器加载好Servlet后,必须进行初始化,初始化Servlet时,可以设置数据库连接参数,建立JDBC连接,或者是建立对其他资源的引用,在初始化阶段,init()方法被调用,这个方法在javax.servlet.Servlet接口中定义。
4.3、服务
Servlet被初始化后,就处于能够响应请求的就绪状态。每个对Servlet的请求都由一个Servlet Request对象代表。Servlet给客户端的响应由一个Servlet Response对象代表。当客户端有一个请求时,Servlet容器将Servlet Request和Servlet Response对象都转发给Servlet,这两个对象以参数的形式传给service()方法。在service()内,对客户端的请求方法进行判断,如果为GET丰富提交,则调用doGet()方法处理请求,如果为POST方法提交,则调用doPost()方法处理请求。
4.4、销毁
Servlet的实例是由Servlet容器创建的,所以实例的销毁也是由容器来完成的。Servlet容器判断一个Servlet应当被释放时(容器关闭或需要回收资源),容器必须让Servlet释放其正在使用的任何资源。这些都是由容器调用Servlet的destroy()方法实现的。Destroy()方法指明哪些资源可以被系统回收,而不是由destroy()方法直接进行回收。
5、 init()方法只有在加载当前的Servlet时被执行,并且只被执行一次。
在服务器停止的时候,或者是系统回收资源时,destroy()方法才被执行。
6、 Servlet的部署与配置
在部署Java Web程序时,web.xml文件、WEB-INF文件夹、classes文件夹。
6.1、web.xml文件
web.xml文件被称为部署描述文件(DD),该文件在程序运行Servlet时起着一个“总调度”的角色,它会告诉容器如何运行Servlet和JSP文件。在web.xml文件中使用两个XML元素(<servlet>和<servlet-mapping>)把用户访问的URL映射到Servlet,其中<servlet-mapping>将用户访问的URL映射到Servlet的内部名,<servlet>元素把Servlet内部名映射到一个Servlet类名(包名+类名)。
web.xml文件的内容示例:
<web-app>
<servlet>
<!—设定当前Servlet的内部名称 -->
<servlet-name>HelloServlet</servlet-name>
<!—指定对应Servlet内部名相关类 -->
<servlet-class>
com.xinxin.servlet.HelloServlet
</servlet-class>
</servlet>
<servlet-mapping>
<!—通过Servlet内部名把URL与CLASS绑定 -->
<servlet-name>HelloServlet</servlet-name>
<!—这是用户访问Servlet的URL -->
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
当客户端发送一个请求的URL指定到<servlet-mapping>中的<url-pattern>值的时候,容器会根据相应的<servlet-name>值查找<servlet>范围内的<servlet-name>对应的<servlet-class>类,然后去执行该类的doGet()或doPost()方法,对用户的请求数据进行处理。
7、 Servlet部署排错误
404错误
原因一:在地址栏中输入的地址错误。输入正确的servlet访问地址。
原因二:<servlet>中<servlet-name>内容与<servlet-mapping>中的<servlet-name>内容不一致。将两者的内容改成一样。
8、 Servlet处理get和post请求
Public void doPost(HttpservletRequest request,HttpServletResponse response) throws ServletException,IOException{
//将输入转换为中文
Request.setCharacterEncoding(“GBK”);
//设置输出为中文
reponse.setContentType(“text/html;charset=GBK”);
String pass = request.getParameter(“password”);
String user = request.getPatameter(“userName”);
RequestDispatchar dispatcher = null;
if(user.equals(“xinxin”) && pass.equals(“xinxin”)){
System.out.println(“登录成功!”);
//如果符合要求,则转发到ok.jsp也没,并在ok.jsp页面中显示用户名
request.setAttribute(“userName”,user);
dispatcher = request.getRequestDispatcher(“/ok.jsp”);
dispatcher.forward(request,response);
}else{
//如果不符合要求,则重定向导登录页面
response.sendRedirect(“register.jsp”);
}
}
8.1、HttpServletRequest request对象常用方法
request.getParameter(“param”);
获取客户端请求数据,param为表单元素名称,返回String类型值。
request.setCharacterEncoding(“GBK”);
将输入内容转换为中文。
request.setAttribute(“userName”,user);
在request作用域内存储数据。
参数userName为存储数据的引用名,类型是String。User为存储的数据,类型为Object。
8.2、HttpServletResponse response对象常用方法
response.setContentType(“text/html;charset=GBK”);
设置输出为中文,解决中文乱码问题。
Response.sendRedirect(“url”);
让浏览器重定向导指定的资源。
参数url为Servlet或JSP、HTML文件的路径。
8.3、转发
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
首先定义转发器。
参数url是欲转发的页面或者Servlet的URL地址。
Dispatcher.forward(request,response);
然后实现转发的功能。参数为请求、响应对象。
8.4、转发和重定向
转发:对应的Servlet代码dispatcher.forward(request,response);
转发是在服务器端起作用的,当使用forward()方法时,Servlet容器传递HTTP请求,从当前的Servlet或JSP到指定的Servlet或JSP,此过程仍然在request作用范围内。转发后,浏览器的地址栏内容不变。
重定向:对应的Servlet和JSP代码是response.sendRedirect(“/ok.jsp”);重定向是在用户的浏览器端工作的,是Servlet对浏览器做出响应后,浏览器再次发送一个新请求,到sendRedirect(“ok.jsp”);指定指定的ok.jsp页面,重定向后,浏览器的地址栏内容发生变化。
如果你想把数据通过request作用域传递到下一个页面或Servlet,那就使用转发。反之,就使用重定向。