Servlet基础知识

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、ServletJSP之间的关系。

 xinxin.jsp在运行时首先解析成一个Javaxinxin_jsp.java,该类继承于org.apache.jasper.runtime.HttpJspBase类,而HttpJspBase又是继承自HttpServlet的类,可见JSP在运行前首先将编译为一个Servlet,由此可见ServletJSP的基础。

2、  如何创建Servlet

使用向导创建Servlet

右键,新建--->Servlet命令,输入Servlet名称,选择超类为javax.servlet.http.HttpServlet,并选中Create doGetCreate 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 RequestServlet Response对象都转发给Servlet,这两个对象以参数的形式传给service()方法。在service()内,对客户端的请求方法进行判断,如果为GET丰富提交,则调用doGet()方法处理请求,如果为POST方法提交,则调用doPost()方法处理请求。

4.4、销毁

Servlet的实例是由Servlet容器创建的,所以实例的销毁也是由容器来完成的。Servlet容器判断一个Servlet应当被释放时(容器关闭或需要回收资源),容器必须让Servlet释放其正在使用的任何资源。这些都是由容器调用Servletdestroy()方法实现的。Destroy()方法指明哪些资源可以被系统回收,而不是由destroy()方法直接进行回收。

5、  init()方法只有在加载当前的Servlet时被执行,并且只被执行一次。

在服务器停止的时候,或者是系统回收资源时,destroy()方法才被执行。

6、  Servlet的部署与配置

在部署Java Web程序时,web.xml文件、WEB-INF文件夹、classes文件夹。

6.1web.xml文件

web.xml文件被称为部署描述文件(DD),该文件在程序运行Servlet时起着一个“总调度”的角色,它会告诉容器如何运行ServletJSP文件。在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内部名把URLCLASS绑定 -->

           <servlet-name>HelloServlet</servlet-name>

           <!—这是用户访问ServletURL -->

           <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处理getpost请求

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.1HttpServletRequest request对象常用方法

    request.getParameter(“param”);

    获取客户端请求数据,param为表单元素名称,返回String类型值。

    request.setCharacterEncoding(“GBK”);

    将输入内容转换为中文。

    request.setAttribute(“userName”,user);

    request作用域内存储数据。

参数userName为存储数据的引用名,类型是StringUser为存储的数据,类型为Object

8.2HttpServletResponse response对象常用方法

    response.setContentType(“text/html;charset=GBK”);

    设置输出为中文,解决中文乱码问题。

    Response.sendRedirect(“url”);

    让浏览器重定向导指定的资源。

    参数urlServletJSPHTML文件的路径。

8.3、转发

    RequestDispatcher dispatcher = request.getRequestDispatcher(url);

    首先定义转发器。

    参数url是欲转发的页面或者ServletURL地址。

    Dispatcher.forward(request,response);

    然后实现转发的功能。参数为请求、响应对象。

8.4、转发和重定向

    转发:对应的Servlet代码dispatcher.forward(request,response);

转发是在服务器端起作用的,当使用forward()方法时,Servlet容器传递HTTP请求,从当前的ServletJSP到指定的ServletJSP,此过程仍然在request作用范围内。转发后,浏览器的地址栏内容不变。

重定向:对应的ServletJSP代码是response.sendRedirect(“/ok.jsp”);重定向是在用户的浏览器端工作的,是Servlet对浏览器做出响应后,浏览器再次发送一个新请求,到sendRedirect(“ok.jsp”);指定指定的ok.jsp页面,重定向后,浏览器的地址栏内容发生变化。

如果你想把数据通过request作用域传递到下一个页面或Servlet,那就使用转发。反之,就使用重定向。

你可能感兴趣的:(java,jsp,servlet,浏览器,服务器,url)