对于servlet初步理解

Servlet在MVC框架中经常担当控制器(Controller)的角色,其作用类似于调度员,下面我们就根据一个简单JavaEE的示例来理解Servlet的机制和原理.

树结构如上,其中

login.jsp作为测试用户登录页面.

welcome.jsp作为登录成功页面

DaDao.java作为数据库操作类

LoginServlet.java就是我们所说的Servlet类

我们来看具体内容:

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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; UTF-8">
<title>连接数据库范例</title>
</head>
<body>
    <span style="color: blue; font-weight: bold;"> <%
    if (request.getAttribute("err") != null) {
        out.println(request.getAttribute("err") + "<br/>");
    }
 %>
    </span> 请输入用户名密码:
    <form id="login" method="post" action="login">
        用户名: <input type="text" name="username"><br /> 密码:<input
            type="password" name="password"><br /> <input type="submit"
            value="登录"><br />
    </form>
</body>
</html>

以上页面只负责传递两个参数,一个是用户名,另一个是用户密码,将参数传递给LoginServlet的实例中,再通过验证数据库进行结果判断,然后Servlet将结果视图反馈给用户.

welcome.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title> 欢迎页面 </title>
    <meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<h3>欢迎登录</h3>
<%=session.getAttribute("name")%>,欢迎登录!
</body>
</html>

此页面是用户密码验证成功后返回的视图.

                  DbDao.java
package glq;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DbDao {

    private Connection conn;
    private String driver;
    private String url;
    private String username;
    private String password;
    public DbDao() {
    }
    public DbDao(String driver, String url, String username, String password) {
        this.driver = driver;
        this.url = url;
        this.username = username;
        this.password = password;
    }
    public String getDriver() {
        return driver;
    }
    public void setDriver(String driver) {
        this.driver = driver;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public Connection getConnection() throws Exception {
        if(conn==null){
            Class.forName(this.driver);
            conn=DriverManager.getConnection(url, username, password);
        }
        return conn;
    }

    public boolean insert(String sql,Object... args) throws Exception, Throwable{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        if(ps.executeUpdate()!=1){
            return false;
        }
        return true;
    }

    public ResultSet query(String sql,Object... args) throws Exception{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        return ps.executeQuery();
    }

    public void modify(String sql,Object... args) throws Exception{
        PreparedStatement ps=getConnection().prepareStatement(sql);
        for(int i=0;i<args.length;i++){
            ps.setObject(i+1, args[i]);
        }
        ps.executeUpdate();
        ps.close();
    }
    public void closeConn() throws Exception{
        if(conn!=null &&!conn.isClosed()){
            conn.close();
        }
    }
}

DaDao类对数据库操作进行了简单的封装,插入了连接数据库,查询记录,修改记录,插曲记录等方法.
                  LoginServlet.java
package glq;

import java.io.IOException;
import java.sql.ResultSet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name="login" ,urlPatterns={"/login"})
public class LoginServlet extends HttpServlet {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        String errMsg = "";
        RequestDispatcher rd;
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        try {
            //创建数据库构造函数
            //注意,连接时要在数据库中创建名为servlet的数据库
            DbDao dd = new DbDao("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/servlet", "root", "123456");
            //执行查询方法
            //注意,要在servlet数据库中添加user_inf表,并在表中添加两个属//性:name,pass
            ResultSet rs = dd.query("select pass from user_inf where name=?", username);
            //如果存在该用户
            if (rs.next()) {
            //判定用户密码是否相同
                if (rs.getString("pass").equals(password)) {
                    //获得session
                    HttpSession session = req.getSession();
                    //注册name值为username
                    session.setAttribute("name", username);
                    //将参数和页面转向welcome.jsp
                    rd = req.getRequestDispatcher("/welcome.jsp");
                    rd.forward(req, res);
                } else {
                //如果密码匹配失败
                    errMsg += "密码不对,请重新输入";
                }
            } else {
                //如果没找到用户
                errMsg += "用户不存在";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //当错误信息存在时,将错误信息errMsg作为参数传递给request中的err变//量,使其在登录页面显示,并因为登录失败跳转至登录页面
        if (errMsg != null && !errMsg.equals("")) {
            rd = req.getRequestDispatcher("/login.jsp");
            req.setAttribute("err", errMsg);
            rd.forward(req, res);
        }

    }
}

在测试时,需要在WEB-INF的lib文件中加入mysql-connector-java-5.1.38-bin.jar包,此包为数据库工具包.

至于tomcat的构建,以及web项目的建立,需要自行检索.

时间: 2024-10-05 05:47:46

对于servlet初步理解的相关文章

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

CSS (一)初步理解

通过牛腩新闻发布系统,接触了CSS,也感受到了它在做Web前台开发时简单方便易更改的优点. 尤其是后边对于CSS盒子的学习和认识,更加让人体会到网页设计和很多事物一样蕴含着深刻的思想和设计技巧,融于生活,表现生活. 本篇文章主要是对CSS内容概况的一些个人理解. CSS,即级联样式表.它真正做到了使网页表现层与内容分离的一种样式设计语言,做到了代码控制界面,简单易修改的解耦效果. 通过CSS,我们可以精确控制对象位置精确到像素级,还可以随心设计对象样式和风格,达到最优的美观度. 下面是CSS的一

CSS初步理解

最近在学习牛腩的时候遇到了网页的制作,挺新鲜的.当中涉及到了有关CSS的知识,于是乎自己也就花费两个小时的时间,找了本浅显易懂的书来看了一遍,从宏观上来了解CSS的相关内容.有关CSS的基础知识详见下链接. CSS基础知识 以下是对CSS理解的导图 通过上图我们也发现,CSS也很难,也容易.容易是说,学起来很快就可以上手,这中语言简单易懂,只要你具备小学英语的知识量就可以了.困难是在指学好它并不容易,因为它需要你耐心.就好比我们对word文档的排版,哪里需要主体鲜明一点,哪里需要着重突出一下,哪

Spring学习笔记--环境搭建和初步理解IOC

Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架. 下面介绍环境的搭建,首先下载好spring的完整包,我下载的是4.2.5版本的,在elipse中,新建java项目: 1,导入核心jar包: 2.在src目录下,创建spring配置文件(名称可以自定义,一般写为beans.xml): <?xml version="1.

初步理解socket

近期研究下socket,发现自己还是有非常多不明确的地方,索性沉下心来,从最基础開始学习,開始看起,如今对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正. 原创文章,转载请注明出处:http://blog.csdn.net/jessonlv TCP/IP 在学习socket之前,先回想下TCP/IP协议. TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机怎样连入因特网及数据怎样再它们之间

通过阅读Oracle Enterprise Asset Management User Guide,我对Oracle eAM的初步理解

通过阅读Oracle Enterprise Asset Management User Guide,我对Oracle eAM的初步理解 Oracle eAM是Oracle EBS套件的一部分,解决资产密集的组织的综合的和常规的设备维护需求.在设备层面追踪所有的维护成本和工作历史,来衡量绩效和最优化维护操作. eAM为组织提供了工具给资产和可重建的库存物料创建和应用维护程序.eAM让用户可以最大化地计划和安排维护活动,同时对组织的运作或生产中断最小.重要的是,它能提高资源有效性,增强维护质量,跟踪

初步理解require.js模块化编程

初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程,这标志”Javascript模块化编程”正式诞生. 在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限:但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程. node.j

关于THINKPHP5模型关联的初步理解

初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则建立belongto关联 注:belongto和hasMany第二个参数外键的定义请仔细查看教程 关联建立后,可以使用with所以查询关联,with是预载入的时候最常用 比如要查找文章的列表,想顺便展示文章的分类名 $list=Article::with('articleType')->where(

【Oracle】 oracle数据库的并发初步理解

先从一个列子来说:我们经常听到说某某网站的每天访问用户数有几十,几千,几百万甚至上千万,同时在线用户数有几万,几十万的. 从这个列子我们来分析,数据库并发的概念. 首先,这儿有两个名词,一个是每天访问的用户数,一个是同时在线用户数.那么这两个数据是不是就是数据库的并发数呢?Oracle数据库的一个相对比较稳定的并发数是200左右,也就是说一台比较好的服务器,并发数在200时,还能够正常的运行,不会死机.由此可见,上面两个数据都不是并发数. 我们再来了解这两个名词的含义. 访问用户数:一个大型的网