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

简单理解一些知识点:

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版)》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值