Servlet基础2


title: "Servlet2"
date: 2019-08-17T16:33:07+08:00


本章内容为:《Servlet基础2》

作者:nuoccc

这篇文章 主要接着上一篇文章,对Servlet做出一些优化方便使用。

1.优化Servelet以及XML

上一篇文章我们了解了Servlet接口,并对它的五个方法做了了解,但是我们知道Servlet的五个方法,有四个都是通过容器来调用的,我们自己需要调用的方法只有service();总体来说其实方法是比较少的,所以我们一般不会去继承Servlet接口,而是改用成继承HttpServlet接口,HttpServlet接口是专门针对Http协议的Servlet实现类,定义在javax.servlet.http包内,接下来我们看下改成HttpServlet的具体用法,关于HttpServlet的原理,这里不做延伸,后面专门拿一篇文章来讲解,这里主要还是说用法。

public class HelloServlet extends HttpServlet {


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("helloServelt");
    }
    //同样的是继承service,其实应该是继承HttpServlet的doGet(),和doPost()方法,但本质一样的。
}

然后同样的配置xml文件,再运行Tomcat就能在页面看见输出了。

但是不觉得每一次都需要去配置xml文件,一个页面一个太麻烦了,所以在Servelt3.0中使用了注解来配置Servelt

具体用法为下:

@WebServlet(value="/HelloSerlet")
//此处为注解,然后value后面就是我们的网络地址,相当于xml的<url-pattern>里面的内容
public class HelloServlet extends HttpServlet {


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         resp.getWriter().write("helloServelt");
    }
}

这样我们就避免了每一次写一个页面就要去配置xml,注解时也可以去掉"value=",直接写成@WebServlet("/HelloSerlet")也是可以的。

我们优化完之后,我们来看看我们怎么利用HttpServlet来获取jsp文件的数据。

2.Servlet获取jsp数据

我们创建一个jsp文件,放入如下的表单数据:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<hr/>
<form action="HelloServlet" method="post">
    账号:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    性别:<input type="radio" name="sex" value="1" checked="checked"/>男
    <input type="radio" name="sex" value="0"/>女<br/>
    爱好:<input type="checkbox" name="hobby" value="足球"/>足球
    <input type="checkbox" name="hobby" value="篮球"/>篮球
    <input type="checkbox" name="hobby" value="排球"/>排球
    <input type="checkbox" name="hobby" value="悠悠球"/>悠悠球<br/>
    <input type="submit" value="注册"/>
    <input type="reset" value="取消"/>
</form>
</body>
</html>

那我们现在获取这些表单中的数据呢?还记得上一篇文章服务器请求对象request有一个getParameter()方法来获得属性吗,同意的HttpRequest对象也有这个方法,因为HttpRequest是继承的SevrletRequest,ServletRequest该有的方法他都会拥有,所以有了这个方法我们就可以去请求获取jsp页面的属性。

@WebServlet(value="/HelloServlet")
public class HelloServlet extends HttpServlet {


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        String sex=req.getParameter("sex");
        String[] hobby=req.getParameterValues("hobby");
        //获得属性数组要用getParameterValues();

        System.out.println(username+","+password+","+sex+","+ Arrays.toString(hobby));
    }
}

然后我们启动Tomcat来看看运行结果:


HttpServlet1.png
HttpServlet2.png
HttpServlet3.png

这样我们就获取到了jsp页面的表单数据,然后我们再加强一下,来结合jdbc完成一个用户注册页面。

3.JDBC+JSP+Servlet完成用户注册页面

因为要加入JDBC所以我们这里就需要导入我们之前写的BaseDao工具类

首先先在web->WEB-INF下面创建一个lib文件夹,里面放入我们的mysql驱动器,然后加入到库内


HttpServlet4.png
HttpServlet5.png

然后在src下导入我们的工具类以及配置文件

HttpServlet6.png

然后创建一个Register.jsp来放入我们的注册表单

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <style type="text/css">
        *{font-size:14px;}
        td:first-child{text-align:right;}
        td:last-of-type a{vertical-align:middle;}
        a:ACTIVE,a:VISITED {color:blue;}
        #checkImg{vertical-align: middle;}
    </style>
</head>
<body>
<center>
    <form action="/Register.do" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td>
                    <input type="text" name="username"/>
                    <font color="red"> *</font>
                </td>
            </tr>
            <tr>
                <td>密码:</td>
                <td>
                    <input type="password" name="password"/>
                    <font color="red"> *</font>
                    <font id="passwordMsg" color="red"></font>
                </td>
            </tr>
            <tr>
                <td>确认密码:</td>
                <td>
                    <input type="password" name="repassword"/>
                    <font color="red"> *</font>
                    <font id="repasswordMsg" color="red"></font>
                </td>
            </tr>
            <tr>
                <td>年龄:</td>
                <td><input type="text" name="age"/></td>
            </tr>
            <tr>
                <td>性别:</td>
                <td>
                    <input type="radio" name="sex" value="男"/>男
                    <input type="radio" name="sex" value="女"/>女
                </td>
            </tr>
            <tr>
                <td>邮箱:</td>
                <td><input type="text" name="email"/></td>
            </tr>
            <tr>
                <td>生日:</td>
                <td><input type="text" name="birthday" /></td>
            </tr>
            <tr>
                <td>擅长的技术:</td>
                <td>
                    <input type="checkbox" name="hobby" value="C"/>C
                    <input type="checkbox" name="hobby" value="C++"/>C++
                    <input type="checkbox" name="hobby" value="Java"/>Java
                    <input type="checkbox" name="hobby" value="IOS"/>IOS
                    <input type="checkbox" name="hobby" value="PHP"/>PHP
                    <input type="checkbox" name="hobby" value="Android"/>Android
                </td>
            </tr>
            <tr>
                <td>地址:</td>
                <td>
                    <select name="address">
                        <option value="none">--请选择地址--</option>
                        <option value="北京">北京</option>
                        <option value="上海">上海</option>
                        <option value="南京">南京</option>
                        <option value="广州">广州</option>
                        <option value="深圳">深圳</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td>自我描述:</td>
                <td>
                    <textarea cols="50" rows="5" name="description"></textarea>
                </td>
            </tr>
            <tr>
                <td></td>
                <td style="text-align:left;padding-top:10px;">
                    <input type="submit" value="注册" />
                    <a href="login.jsp">登录</a></td>
            </tr>
        </table>
    </form>
</center>
</body>
</html>

然后我们创建一个数据库来对应这个表单的数据

CREATE table test_user(
id int(4) primary key auto_increment,
username varchar(20) not null,
password varchar(20) not null,
age int(3) not null,
sex varchar(10) not null,
email varchar(30) not null,
birthday date not null,
hobby varchar(30) not null,
address varchar(40) not null,
description varchar(200) not null
)engine=innodb default charset=utf8;

然后我们创建一个RegisterServlet来获取JSP文件的数据,并且传入数据库

@WebServlet("/Register.do")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");//设置响应的格式为html,字符集为utf-8
        req.setCharacterEncoding("utf-8");//设置请求的字符集为utf-8

       String usename = req.getParameter("username");
       String password =  req.getParameter("password");
       String age = req.getParameter("age");
       String sex = req.getParameter("sex");
       String email = req.getParameter("email");
       String birthday = req.getParameter("birthday");
       String[] hobby = req.getParameterValues("hobby");
       String address = req.getParameter("address");
       String desciption = req.getParameter("description");
        //获取表单的属性
        System.out.println(usename+","+password+","+age+","+sex+","+email+","+birthday+","+ Arrays.toString(hobby)+","+address+","+desciption);
        //打印测试看是否拿到表单数据

        BaseDao bd = new BaseDao();
        //创建一个工具类对象
        String sql = "insert into test_user value(null,?,?,?,?,?,?,?,?,?)";
        //插入的sql语句
        Object[] parms = {usename,password,age,sex,email,birthday, Arrays.toString(hobby),address,desciption};
        //把数据放入数租内
        bd.myExecuteUpdate(sql,parms);
        //调用工具类的新增功能

    }
}
HttpServlet7.png
HttpServlet8.png

这样我们的一个结合JDBC+JSP+Servlet的注册程序就完成了,然后我们再来画个整体的流程图

HttpServlet9.png

我们完成了注册页面,有注册就会有登陆,所以我们再来完成一个登录页面

4.JDBC+Jsp+Servlet完成登录页面

同样的我们先创建一个登录的Jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <style type="text/css">
        *{font-size:14px;}
        td:first-child{text-align:right;}
        td:last-of-type a{vertical-align:middle;}
        a:ACTIVE,a:VISITED {color:blue;}
        #checkImg{vertical-align: middle;}
    </style>
</head>
<body>
<center>
    <form action="Register.do" 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>
                <td></td>
                <td style="text-align:left;padding-top:10px;">
                    <input type="submit" value="登录" />
                </td>
            <td style="text-align:left;padding-top:10px;">
                <input type="submit" value="取消" />

            </td>>
            </tr>
        </table>
    </form>
</center>
</body>
</html>

数据库和工具类还是之前那个,所以我们只需要再创建一个Servlet就可以了

@WebServlet("/LoginServlet.do")
public class LoginServlet extends HelloServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //设置字符集

        String username=req.getParameter("username");
        String password=req.getParameter("password");
        //获得表单属性

        BaseDao bd  = new BaseDao();
        //创建工具类对象
        String sql = "select * from test_user where username=? and password=?";
        //数据库查询语句,查找是否存在一行的username和password等于输入的username和password
        Object[] parms = {username,password};
        ResultSet rs = bd.myExecuteQuery(sql,parms);
        //执行数据库查询语句,并返回一个结果集
        try {
            if(rs.next()){
                //如果查询到有这么一行数据,结果集就不为空,就代表账号和密码正确
                resp.getWriter().write("<script>alert('登录成功')</script>");
            }else {
                resp.getWriter().write("<script>alert('登录失败')</script>");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        }
    }
}
HttpServlet10.png
HttpServlet11.png

这样我们基于JDBC+JSP+Servlet完成网页最基本的登录和操作就完成了,但是其实有个问题,我们每一个页面就需要创建一个Servlet,一个大型网站,有上百上千个网页,创建这么多Servlet其实也不方便后期处理,并且,几个页面的耦合度其实很高,但是这篇文章就先写到这里,下一篇文章将会对这两个方面方便进行优化,并完成CRUD操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 3,854评论 0 11
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,436评论 0 10
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 1,005评论 0 0
  • 简介 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用...
    寒桥阅读 2,300评论 0 10
  • 今天加入了默铮老铁的默曾同学会。 我为什么要加入这个读书会呢?有以下三个理由。 第一,是对默铮老铁的信任,参加剽悍...
    艾斯拉庞德阅读 521评论 0 2