servlet要点详解以及相关的例子

来源:互联网 发布:mac怎么重命名文件 编辑:程序博客网 时间:2024/05/17 02:01

简单理解一些知识点:

1 Servlet的概念

---server上运行的用于处理client请求和响应的Java程序

 

2 Servelt的配置3

----web.xml中配置mapping( Servelt名字和对应的Servelt)

----html在页面中调Servelt

----声明自己定义的Servlet类,需要继承HttpServlet类。

 

3 cookie实际是保持在client上的name-value,有过期时间,可以保存一些需要的数据供后续server端使用。需要注意的是getCookies返回的是数组。addCookie隐含有update操作。

 

4 filter过滤器,可以定义对某些url执行一些顺序的操作,调用顺序和mapping顺序一致

 

5 session跟踪,主要是为了解决同一用户在server的不同page上切换发送响应时,避免重复验证用户id的操作。

 

6 page页面上表单作为参数传递到servlet上主要是用request.getParameterrequest.getParameters方法。

 

 

其他概念:

 

1 doGetdoPostdoPutdoDelete方法

doGet一般是执行查询,url中会有变量的信息,比较不安全。

doPost一般会有update操作,url中不会有变量的信息,比较安全。

 

2 HttpServletRequest 客户端请求对象

----实质相当于是上行接受客户端消息的一些参数

 

3 HttpServletResponse 服务端响应对象

----实质相当于是下行响应发送给客户端消息的一些参数

 

4 最基本的使用servlet,不适用JSPstruts等高级框架,实质上是把servelt作为MVC中的controller来做的。

 

5 init方法是给容器(比如Tomcat)调用的,只在servlet使用web.xml创建完毕后,执行前调用一次。

可以自定义重写servletinitservicedestroy方法,实现一些定制需求。因为写servlet的时候都要继承httpServlet,所以也会继承这几个方法,容器也会调用这几个方法实现。

 

6 http协议的状态码:

400-499:客户端的错误

500-599:服务端的错误
503
service unavailable服务不可用,server端没有响应,可能是服务端一直再计算,没有给出响应,也可能是其他原因响应超时。

 

 

零碎的问题解决:

1 tomcatdubug模式出现path not found主要参考stackoverflow的解决方法,修改完要重启eclipse

http://stackoverflow.com/questions/6174550/eclipse-java-debugging-source-not-found

 

2 url地址对应的项目文件/项目名/文件名,或者是web.xml中配置的urlservlet的对于关系,截图:

 

3 乱码问题参考我之前的文件,添加字符编码的说明即可解决:

 

具体例子:

1 通过表单获取前台数据,包含从web.xml中获取初始化的一些变量 

<?xml version="1.0" encoding="gb2312"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"    version="2.4">    <servlet>    <!-- 1 servlet和class的映射 -->        <servlet-name>TestServlet</servlet-name>        <servlet-class>com.hj.servlet.TestServlet</servlet-class>        <!-- 2 传参数 -->        <init-param>            <param-name>msg</param-name>            <param-value>welcome you</param-value>        </init-param>    </servlet>    <!-- 3 servlet和url的映射 -->    <servlet-mapping>        <servlet-name>TestServlet</servlet-name>        <url-pattern>/TestServlet</url-pattern>    </servlet-mapping></web-app>
<!-- 1 解决乱码问题 --><%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %><html>    <head>    <meta http-equiv="Content-Type" content="text/HTML; charset=gbk">        <title>Welcome you!</title>    </head>    <body>  <!-- 2 action名对应servlet名 例子中用的是post则对应servlet中的doPost方法 -->  <!-- 3 input中的name对应于serlve中直接通过名称提取变量 -->        <form action="TestServlet" method="post">            user name: <input type="text" name="user"><p>            <input type="submit" value="提交">        </form>    </body></html>

package com.hj.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet{    public void doGet(HttpServletRequest req, HttpServletResponse resp)        throws ServletException,IOException    {        req.setCharacterEncoding("gb2312");        //1 通过表单的name获取表单的变量名        //2 如果要表单的所有变量可以用getParameters返回数组类型,具体参考api        String user=req.getParameter("user");        //3 getInitParameter获取web.xml中配置的变量        String welcomeMsg=getInitParameter("msg");        resp.setContentType("text/html;charset=gb2312");        PrintWriter out=resp.getWriter();        //4 直接返回html给client        out.println("<html><head><title>");        out.println("Welcome Page");        out.println("</title><body>");        //5 变量的调用        out.println(welcomeMsg+", "+user);        out.println("</body></head></html>");        out.close();    }    //6 由于在JSP中调用的post所以会调用这个方法,doGet也在这里    public void doPost(HttpServletRequest req, HttpServletResponse resp)        throws ServletException,IOException    {        doGet(req,resp);    }}

目录结构:


对应url

http://localhost:8080/TestServletJsp/index.jsp

 

2 cookie的读写操作: 

public class CookieTest extends HttpServlet {    public void doGet(HttpServletRequest request,                    HttpServletResponse response)    throws ServletException, IOException     {        for(int i=0; i<3; i++)         {          // 1 Max-Age过期时间单位是秒,Age为0表示过期 过期后cookie将被删除          // 1.1 默认的过期时间是-1,          // 1.2 负的表示仅限当前browser browser关闭则过期          Cookie cookie = new Cookie("Session-Cookie-" + i,//cookie的name,value对                                     "Cookie-Value-S" + i);          //                                     response.addCookie(cookie);          cookie = new Cookie("Persistent-Cookie-" + i,                              "Cookie-Value-P" + i);          // Cookie is valid for an hour, regardless of whether          // user quits browser, reboots computer, or whatever.          cookie.setMaxAge(3600);          response.addCookie(cookie);        }        response.setContentType("text/html");        PrintWriter out = response.getWriter();        String docType =          "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +          "Transitional//EN\">\n";        String title = "Active Cookies";        out.println(docType +                    "<HTML>\n" +                    "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +                    "<BODY BGCOLOR=\"#FDF5E6\">\n" +                    "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +                    "<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +                    "<TR BGCOLOR=\"#FFAD00\">\n" +                    "  <TH>Cookie Name\n" +                    "  <TH>Cookie Value");        Cookie[] cookies = request.getCookies();    if (cookies == null)    {      out.println("<TR><TH COLSPAN=2>No cookies");    }     else     {      for(Cookie cookie: cookies)       {        out.println          ("<TR>\n" +           "  <TD>" + cookie.getName() + "\n" +           "  <TD>" + cookie.getValue());      }    }    out.println("</TABLE></BODY></HTML>");  }}

5 session跟踪:

 

6重写initservicedestroy 

package com.hj.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebInitParam;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class testInit extends HttpServlet {    private static final long serialVersionUID = 1L;    /**     * Default constructor.      */    public testInit() {        super();    }    //1 重写 init方法    @Override    public void init(ServletConfig config) throws ServletException {        // TODO Auto-generated method stub        //1.1 调用父类HttpServlet的方法        super.init(config);        //1.2 自己添加的方法        System.out.println("init方法被执行");        System.out.println("相关的初始化参数:");        //1.3 获取config的信息        System.out.println(config.getInitParameter("info"));    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doPost(request, response);    }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        PrintWriter printWriter = response.getWriter();        printWriter.write("Hello world");    }    @Override    protected void service(HttpServletRequest arg0, HttpServletResponse arg1)        throws ServletException, IOException {        super.service(arg0, arg1);        System.out.println("service方法被执行");    }    @Override    public void destroy() {        super.destroy();        System.out.println("destroy方法被执行");    }}

 

主要参考:

Servlet教程各种方法的api和例子都有介绍

ServletJSP核心编程(第2版)》


0 0
原创粉丝点击