day02

2018-07-17  本文已影响0人  折翼自由

Servlet入门

1.1Serlvet介绍

API.png

文档总结:

什么是servlet?
处理请求和响应的java程序。

怎么创建servlet?
继承HttpServlet类,在web.xml中配置

1.2Servlet开发的步骤:(重点)

1、在cn.igeek.web包下 创建一个类 实现 HttpServlet 类
2、重写doGet和doPost方法
package cn.igeek.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DemoServlet
 */
@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DemoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet....");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost....");
        doGet(request, response);
    }

}
3、在当前项目中的web.xml文件中配置当前开发好的Servlet程序
<servlet>
    <!-- servlet的名称 -->
    <servlet-name>DemoServlet</servlet-name>
    <!-- servlet的具体实现类 -->
    <servlet-class>cn.igeek.web.DemoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <!-- servlet的名称 -->
    <servlet-name>DemoServlet</servlet-name>
    <!-- 访问这个servlet程序的请求路径 -->
    <url-pattern>/DemoServlet</url-pattern>
  </servlet-mapping>
4、发布这个项目,运行服务器,测试
doGet....

1.31.6获取请求(重点)

准备HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day02/my" method="post">
用户名:<input type="text" name="username"><br>
爱    好:<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="basketball">篮球<br>
<input type="submit" value="提交">
</form>
</body>
</html>

发送请求,之后要接收,对于提交上了的用户名,爱好,我们必须获取后,才能处理,那么请求参数如何获取?
使用服务器给我提供的一个对象Request对象!!!!!


request.png

获取参数的方法有哪些?

String getParameter(String name)
            根据name获取对应的值
Map   getParameterMap()
            参数名作为key,参数值作业value,封装到map中
String[] getParameterValues(String name)
            获取name相同的所有value 例如复选框

//需求:获取注册页面的值。
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                      System.out.println("getParameter:"+request.getParameter("username"));
        System.out.println("===============");
        String[] values = request.getParameterValues("hobby");
        for (String string : values) {
            System.out.println("getParameterValues:"+string);
        }
        System.out.println("===============");
        Map<String, String[]> map = request.getParameterMap();
        for(String key : map.keySet()){
            for (String value : map.get(key)) {
                System.out.println("getParameterMap:"+value);
            }
        }   
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

1.4发送响应(重点)

response.png

这个对象用于向浏览器发出响应,要使用的方法为:

java.io.PrintWriter getWriter()
返回可将字符文本发送到客户端的PrintWriter 对象

PrintWriter.png

要使用的方法:
void write (String s)
写入字符串
代码:

System.out.println("========发出响应===========");
        response.getWriter().write("test OK!!!!");

第2章Servlet开发应用——登录案例(重点)

2.1需求分析

图片1.png

2.2准备工作

<form action="../login" method="post">
<table>
    <tr>
        <td>用户名</td>
        <td><input type="text" name="username"/></td>
    </tr>
    <tr>
        <td>密码</td>
        <td><input type="password" name="password"/></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" value="登录"/></td>
    </tr>
</table>
</form>

Debug调试模式界面介绍:
开启debug模式操作:1 服务器启动必须dubug模式 2 需要查看的位置双击设置断点

2.2.1最终结构
图片2.png

2.3登录servlet

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取请求参数(username  password)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //开启debug模式操作:1 服务器启动必须dubug模式  2 需要查看的位置双击设置断点
        
        //封装数据到user对象
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        
        //调用service方法,执行用户登陆
        UserService userService = new UserService();
        User loginUser = userService.login(user);
        //根据返回的结果,给出不同提示信息
        if(loginUser == null){
            //用户名或者密码错误,login error
            response.getWriter().write("login error");
        }else{
            //登陆成功,login OK
            response.getWriter().write("login OK");
        }
        
}

2.4 业务层

public class UserService {
    private UserDao userDao = new UserDao();
    /**
     * 用户登陆的方法
     * @param user
     * @return
     */
    public User login(User user) {
        return userDao.login(user);
    }
}

2.5数据层

public class UserDao {

private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
public User login(User user) {
    String sql = "select * from user where username = ? and password = ?";
    try {
      return qr.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("用户登陆失败");
        }
    }
}

第3章servlet其他

3.1Servlet的生命周期(了解)

生命周期:是说一个对象从创建到销毁的整个过程。称为整个对象的一个生命周期。


图片3.png

上图描述了servlet的生命周期。按照功能的不同,大致分为三个阶段,分别是 初始化阶段,运行阶段(最频繁) 和 销毁阶段。
注意:当服务器关闭的时候,项目中的servlet就调用第8步销毁。

总结:Servlet 的创建,在用户第一次请求,之后,创建。销毁,是发生在服务器关闭的时候。

3.1.1初始化阶段

当客户端向tomcat发送http请求访问servelt程序,tomcat首先会解析请求,检查内存中是否已经有了该servlet对象:
如果有直接使用对应的servlet对象;
如果没有就创建servlet实例对象,然后通过调用init() 方法实现Servlet的初始化工作。
需要注意的是,在整个servlet的生命周期内,init方法只被调用了一次。
测试:添加了init方法

public class DemoServlet extends HttpServlet{

    @Override
    public void init() throws ServletException {
        System.out.println("DemoServlet....init....");
        super.init();
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DemoServlet.....doGet....");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {      System.out.println("DemoServlet.....doPost....");
    }
}

3.1.2运行阶段

在这个阶段,tomcat服务器会为这个请求 创建 代表HTTP请求的ServletRequest对象 和 代表HTTP响应的 ServletResponse对象,然后将他们作为参数传递给service() 方法。
servcie() 方法从ServletRequest对象获取请求的信息并做出处理;通过ServletResponse 对象生成响应的结果。
在servlet的整个生命周期内,对于servlet的每一次访问请求,tomcat都会调用servlet的service方法,并且创建新的ServletRequest对象和ServletResponse对象。也就是说service() 方法会servlet的生命周期内会被调用多次。

doGet和doPost由service方法调用:在我们写的servlet父类HttpServlet中源码:


图片4.png

源码展示:////////////////标记重点////////////////////

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

        String method = req.getMethod();
/////////////////////////////////////////////
        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
//////////////////////////////////////////////////////            
} else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }

        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);

        } else if (method.equals(METHOD_POST)) {
///////////////////////////////////////////
            doPost(req, resp);
///////////////////////////////////////////
            
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);        
            
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
            
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
            
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
            
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //

            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

3.1.3销毁阶段

当服务器关闭时,servlet会随着Web应用的销毁而销毁。
在销毁serlvet之前,tomcat 会调用Servlet的destory方法,以便让Servlet对象释放他所占用的资源。

第4章ServletConfig介绍

应用场景:
为了将一些灵活需要修改的内容,设置到web.xml中,后期 ,可以在不修改代码的情况下,通过修改配置文件,达到,修改内容的目的


图片5.png
图片6.png
图片7.png

servlet容器: tomcat(java的web服务器)
sun公司要求服务器,创建servlet的同时,再去创建一个servletConfig对象. ServletConfig包含了一些Servlet的配置信息.
再调用servlet的init方法时,将servletCongfig传给servlet
servletConfig的内容是 是自己定义的. 在web.xml中 的servlet标签下书写servletConfig的内容.

图片8.png

ServletConfig它读取某个Servlet的配置信息。
1、如果servlet需要一些参数. 我们可以在web.xml的servlet标签内进行配置

图片9.png

2 tomcat去工作: 读取servlet中init-param这个标签. 把里面的内容封装到ServletConfig中
3 tomcat去工作: 调用servlet的init方法, 把封装好的 servletConfig对象, 传递给servlet中.
调用servelt中的init(ServletConfig config)

private transient ServletConfig config;

public void init(ServletConfig config) throws ServletException{
this.config=config;
this.init();
}

4 如何使用
获取servletConfig对象, 通过servlet的getServletConfig() 方法

//获取servletconfig对象
ServletConfig cfg =this.getServeltConfig();

获取内部的参数值:通过servletConfig.getInitParameter(key)

//从对象中根据key 获取value
String company =cfg.getInitParameter("company")

5、重启tomcat,地址栏访问 对应的servlet

上一篇下一篇

猜你喜欢

热点阅读