1 Servlet

1.1 Servlet概述

运行在服务器端的一个java小程序。

1.2 Servlet的作用

使用servlet可以对用于在浏览器端发出的请求做出相应的处理,并给出相应的结果;

1.3 Servlet的访问流程分析

浏览器访问tomcat服务器的路径查找流程示意图.jpg

1.4 Servlet的快捷创建方式

1:使用eclipse的模板直接创建servlet即可;(会自动在web.xml中完成servlet配置的过程)
image.png
image.png
image.png
image.png
参考代码:

  1. public class MyServlet2 extends HttpServlet {
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //处理方案.....
  4. }
  5. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  6. //为了保证将来浏览器无论发送什么请求(get或post),我们编写的doGet中的代码都会执行起来
  7. doGet(request, response);
  8. }
  9. }

结论:
我们程序员自己写的doGet方法和doPost方法会被父类(HttpServlet)中的service方法调用。(servlet中的service方法是被tomcat服务器调用的)

1.5 Servlet中用户传递的参数的获取-request

request对象是由tomcat服务器创建的,且用户在浏览器每发出一次请求,服务都会创建一次对象,这个对象的数据类型是:HttpServletReqesut类型。
常用的获取参数的方法:
String getParameter(“属性名”);// 仅根据一个名字获取一个值使用
String[] getParameterValues(“属性名”);//根据一个名字获取一个数组值使用,例如: 爱好
Map getParameterMap();//获取请求对象中携带的所有键值对参数数据
参考代码:

        //1:获取一个名称的参数
        request.setCharacterEncoding("utf-8");//解决post请求中的中文参数乱码问题;(对get无效)
        String p = request.getParameter("username");
        //2:获取一个数组
        String[] values = request.getParameterValues("hobby");
        //3:获取一个map集合
        Map<String, String[]> map = request.getParameterMap();
        System.out.println("一个参数:"+p);
        System.out.println("一个数组:"+Arrays.toString(values));
        Set<Entry<String,String[]>> set = map.entrySet();
        for (Entry<String, String[]> en : set) {
            String key = en.getKey();
            String[] value = en.getValue();
            System.out.println(key+"====>"+Arrays.toString(value));
        }

1.6 Servlet的生命周期问题(重要)

什么是生命周期?
从对象创建,到对象死亡中间经历的所有事情就是生命周期;
1:init方法,就是servlet对象创建时会被tomcat调用的方法。
(init方法仅会被调用一次,因为servlet对象是单例的,一个servlet类,tomcat仅会创建一个对象,且默认是在第一个用户访问的时候创建)
2:service方法
每一次用户访问这个地址的时候,tomcat都会调用一次这个方法。
3:destroy方法
当servlet对象被销毁的时候,tomcat会调用一次这个方法。
销毁的时机:
1:tomcat正常停止。(知道)
2:tomcat运行状态中,将工程移除。(了解)
参考代码:

@Override
    public void init() throws ServletException {
        super.init();
        System.out.println("servlet被创建了:"+this);
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet处理了一次请求:"+this);
    }
    @Override
    public void destroy() {
        super.destroy();
        System.out.println("servlet被弄死了:"+this);
    }

注意事项:
可以通过修改web.xml配置文件,让servlet随着tomcat的启动而创建。
代码:

<servlet>
    <description></description>
    <display-name>Life</display-name>
    <servlet-name>Life</servlet-name>
    <servlet-class>com.itheima.demo04_life.Life</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

关于数字值,建议写2以上的正整数,因为tomcat自己的servlet创建的优先级是1。

1.7 Servlet的访问路径

在servlet中关于路径匹配的配置方式有4种:
1:绝对匹配 (重点)
/xxx
2:目录匹配(通配符匹配)
/xxx/xxx/
3:后缀名匹配
.xxx
4:缺省匹配;(当访问的路径与上述的3种情况都不匹配的时候,才会执行缺省匹配)
/
如果多种路径同时匹配成功的时候,会按照优先级,优先选择最高的一个执行;
从大到小: 1>2>3>4

1.8 servletConfig对象(了解)

servletConfig代表的是servlet启动的时候在servlet中进行的参数配置的对象。
作用:
可以通过这个对象,读取web.xml中给servlet配置的参数信息。
使用前提:
事先在web.xml中配置参数:格式:

<servlet>
    <description></description>
    <display-name>MyConfig</display-name>
    <servlet-name>MyConfig</servlet-name>
    <servlet-class>com.itheima.demo06_config.MyConfig</servlet-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
     <init-param>
        <param-name>username</param-name>
        <param-value>jack</param-value>
    </init-param>

  </servlet>

API相关方法:
getInitParameter(“属性名”);
getInitParameterNames();

2 案例-用户登录案例

2.1 需求

让用户在页面上输入用户名和密码,提示登录的结果;

2.2 分析

1:需要编写html页面;在页面中编写一个form表单
2:编写表单对应的servlet类;(类中的步骤,参考代码)
3:编写service和dao层代码;
(domain和数据库创建,jar包选择等)

2.3 流程分析示意图

用户登录的流程分析.jpg

2.5 参考代码

html

<form action="http://localhost/day30/LoginServlet" method="post">
        用户名:<input type="text" name="username">
        <br>
        密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password">
        <br>
        <input type="submit" value="提交">
    </form>

Web:(servlet)

        /*
         *     1:获取用户携带的参数;
            2:调用service层传递参数,获取一个user对象;
            3:判断,如果查询到了,则提示登录成功,否则登录失败
         */
        //1:获取用户携带的参数;
        String un = request.getParameter("username");
        String ps = request.getParameter("password");
        //2:调用service层传递参数,获取一个user对象;
        UserService us = new UserService();
        User u = us.findUserByUsernameAndPassword(un,ps);
        //3:判断,如果查询到了,则提示登录成功,否则登录失败
        response.setContentType("text/html;charset=utf-8");
        if(u==null){
            //登录失败
            response.getWriter().println("亲,用户名或密码错误!");
        }else{
            response.getWriter().println("欢迎您:"+un);
        }

Service:

//根据用户名和密码查询数据库对象
    public User findUserByUsernameAndPassword(String un, String ps) {
        return new UserDao().findUserByUsernameAndPassword(un,ps);
    }

Dao层:

//根据用户名和密码查询数据库对象
    public User findUserByUsernameAndPassword(String un, String ps) {
        //1:创建sql执行者    QueryRunner
        QueryRunner q = new QueryRunner(MyC3P0Utils.getDataSource());
        //2:编写sql语句
        String sql = "select * from user where username = ? and password = ?";
        //3:准备参数与结果集
        BeanHandler rsh = new BeanHandler(User.class);
        //4:执行sql返回结果
        try {
            return q.query(sql, rsh,un,ps);
        } catch (SQLException e) {
            e.printStackTrace();
            //万一出了异常,就抛出一个运行时期的异常,将程序停下来
            throw new RuntimeException();
        }

    }

数据库:
image.png