Servlet入门

1 编写流程

1)在网页端提交表单数据,根据url调用tomcat服务器中的Servlet程序(http://localhost:8080/ServletTest1/register),这个注册请求会调用tomcat中的名字为register的servlet程序
2)根据上一步所知,在web.xml中找到 /register,其对应的类是com.book.web.RegisterServle

	<servlet>
        <servlet-name>register</servlet-name>
        <servlet-class>com.book.web.RegisterServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>register</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>     

3)编写相应的Servlet程序

public class RegisterServlet extends HttpServlet {
    // private   UserService userservice=new UserServiceImpl();  在这里声明变量会报错,因为在web下的jar没有导入到WEB-INF的lib中

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        UserService userservice=new UserServiceImpl();      //
        //密码参数不显示
         //1.获取参数
       // Connection connetion = jdbcutils.getConnetion();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        String code = req.getParameter("code");
        System.out.println(username);
        //2.检查验证码合法与否
        if("abcde".equals(code)){
            if(userservice.existUsername("root"))
                System.out.println("用户名已经存在");
            else{//将用户数据保存进数据库,使用service,间接调用的Dao
                System.out.println("存进数据库");
                userservice.registerUser(new user(username,password,email));
                }
                RequestDispatcher requestDispatcher = req.getRequestDispatcher("/pages/user/regist_success.html");
                requestDispatcher.forward(req,resp);
            }
     else{ //不合法,返回注册页面
            System.out.println("验证码错误");
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/pages/user/regist.html");
            requestDispatcher.forward(req,resp);
        }
    }
}

2 Servlet类的简介

1 Servlet类

public interface Servlet {
//生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    void init(ServletConfig var1) throws ServletException;
//生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

2 GenericServlet类

在 GenericServlet 中,主要完成了以下任务:

  • 在init() 中的 ServletConfig 赋给一个类级变量,可以由 getServletConfig 获得
  • 为 Servlet 所有方法提供默认实现
  • 可以直接调用 ServletConfig 中的方法
abstract class GenericServlet implements Servlet,ServletConfig{
 
   //GenericServlet通过将ServletConfig赋给类级变量
   private trServletConfig servletConfig;
 
   public void init(ServletConfig servletConfig) throws ServletException {

      this.servletConfig=servletConfig;

      /*自定义init()的原因是:如果子类要初始化必须覆盖父类的init() 而使它无效 这样
       this.servletConfig=servletConfig不起作用 这样就会导致空指针异常 这样如果子类要初始化,
       可以直接覆盖不带参数的init()方法 */
      this.init();
   }
   
   //自定义的init()方法,可以由子类覆盖  
   //init()不是生命周期方法
   public void init(){
  
   }
 
   //实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 
   public abstract void service(ServletRequest request,ServletResponse response) 
     throws ServletException,java.io.IOException{
   }
 
   //实现空的destroy方法
   public void destroy(){ }
}

3 HttpServlet

       HttpServlet 中对原始的 Servlet 中的方法都进行了默认的操作,不需要显式的销毁初始化以及 service(),在 HttpServlet 中,自定义了一个新的 service() 方法其中通过 getMethod() 方法判断请求的类型,从而调用 doGet() 或者 doPost() 处理 get,post 请求,使用者只需要继承 HttpServlet,然后重写 doPost() 或者 doGet() 方法处理请求即可。

abstract class HttpServlet extends GenericServlet{
 
   //HttpServlet中的service()
   protected void service(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse){
        //该方法通过httpServletRequest.getMethod()判断请求类型调用doGet() doPost()
   }
 
   //必须实现父类的service()方法
   public void service(ServletRequest servletRequest,ServletResponse servletResponse){
      HttpServletRequest request;
      HttpServletResponse response;
      try{
         request=(HttpServletRequest)servletRequest;
         response=(HttpServletResponse)servletResponse;
      }catch(ClassCastException){
         throw new ServletException("non-http request or response");
      }
      //调用service()方法
      this.service(request,response);
   }
}

4 doGet和doPost

底层都是TCP连接
1)但GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
2)GET参数通过URL传递,POST放在Request body中
3)由于上一个不同,所以两者传递的参数长度限制不同:其实两者都没有长度限制,但是url是在浏览器地址栏,所以会被浏览器限制;而post利用requestBody则没有限制(100K)
4)POST的安全性要比GET的安全性高,也是因为第2个不同导致的(url参数在地址栏可见)

      在jsp中的form中,默认的提交方式就是get

上一篇:javaweb:requse学习


下一篇:关于CQRS的知识汇总