Servlet(一)

本文详细介绍了Servlet的基本概念,包括如何创建和配置Servlet,处理客户端请求,以及实现简单的用户登录案例。通过示例代码,展示了Servlet的执行流程和配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 认识servlet

 

1.1概念

Servlet是运行在服务器端的java小程序。

 

1.2编写第一个servlet

①在src中创建一个java类HelloServlet

②让类继承HttpServlet,并且重写doGet方法。

package com.igeek.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class HelloServlet extends HttpServlet{

    @Override

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

       System.out.println("执行了HelloServlet--doGet");

    }

}

 

Tips:javax.servlet包来自于javaEE的标准,由tomcat提供的jar包。不是jdk的jar包。

③打开web.xml配置servlet

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!-- web工程的显示名称 -->

    <display-name>day01_demo1</display-name>

    <!-- 欢迎页的配置 -->

    <welcome-file-list>

       <welcome-file>index.html</welcome-file>

    </welcome-file-list>

    <!-- 配置servlet -->

    <servlet>

       <!-- servlet的名称 -->

       <servlet-name>HelloServlet</servlet-name>

       <!-- servlet的完整类名 -->

       <servlet-class>com.igeek.servlet.HelloServlet</servlet-class>

    </servlet>

    <!-- 配置Servlet映射 -->

    <servlet-mapping>

       <!-- servlet的名称,这里的名称要和对应的serlvet的名称一致 -->

       <servlet-name>HelloServlet</servlet-name>

       <!-- 访问此servleturl -->

       <url-pattern>/hello</url-pattern>

    </servlet-mapping>

</web-app>

 

 

启动服务器在浏览器中访问servlet:

 

控制台输出:

 

到此为止servlet已经配置完成,并且成功被访问。

 

1.3servlet的执行流程和配置详解

 

1.3.1Servlet的配置

每一个servlet需要在web.xml文件中配置

 

每编写一个servlet都需要在web.xml文件中配置两组标签

S1:<servlet></servlet>标签的主要作用是通知tomcat  servlet的存在。

其中的子标签:

必须配置的标签:

 必须给每一个servlet起一个名称,而且不能重复。此名称在servlet-mapping中会再次使用。

可选标签:

此标签配置的是servlet的完整类名。Tomcat会根据完整的类名创建此servlet的对象。

Servlet-class和jsp-file是二选一的。  就是if else的关系。

S2:<servlet-mapping></servlet-mapping>配置servlet的映射,访问方式。

其中字标签

Servlet-name必须和serlvet标签中的servlet-name一致、。

url-pattern配置访问模式。

一个servlet可以配置多个servlet-mapping。多个url可以访问同一个servlet对象。

 

1.3.2servlet的执行流程

访问servlet:

流程:

请求服务器

http://localhost:8888/day01_demo1/hello1

http://localhost:8888/  进入tomcat

day01_demo1 进入应用程序

/hello1  查找web.xml文件,查找servlet-mapping中url-patten为/hello1,通过servlet-name找到对应的servlet配置,查找对应servlet类,创建类对象,执行对应的方法,响应客户端。

 

1.4servlet处理客户端的请求

Servlet中存在方法doGet()。

就是通过doGet或者doPost处理请求的。

doGet方法有两个参数:

参数1:HttpServletRequest 

         此参数中包含了所有的请求信息,可以通过此参数对象提供的API获取所有的请求信息。

参数2:HttpServletResponse

         此参数为我们提供了响应客户端的API(方法)。

 

这两个参数是由tomcat(servlet容器)提供的。  我们只管使用即可。

处理案例:

package com.igeek.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.xml.ws.Response;

 

public class HelloServlet extends HttpServlet{

    @Override

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

       //获取请求头消息

       //获取请求头的名称集合

       Enumeration<String> names = req.getHeaderNames();

       //按照迭代器的方式遍历

       while(names.hasMoreElements()) {

           //循环的取出请求头名称

           String name = names.nextElement();

           //通过请求头名称获取请求头内容

           String value = req.getHeader(name);

           //输出请求头消息

           System.out.println(name+":"+value);

       };

       //执行自己的代码

       System.out.println("执行了HelloServlet--doGet");

       //通过response响应客户端

       //解决响应中的中午乱码问题

       resp.setContentType("text/html;charset=utf-8");

       //通过response获取一个输出流 (此输出流就指向客户端)

       PrintWriter writer = resp.getWriter();

       //通过输出流输出要响应的字符

       writer.write("<h1>响应客户端--HelloServlet</h1>");

       //释放资源

       writer.close();

    }

}

 

浏览器中的请求:

响应头消息:

 

后台控制台中:

 

1.5完成一个简单的用户登录的案例

编写html,在webContet中添加login.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

    <form action="" method="get">

       <p>用户名:<input type="text" name="uname"/></p>

       <p>密码:<input type="text" name="upass"/></p>

       <p><input type="submit" value="登录"/></p>

    </form>

</body>

</html>

 

测试页面:

 

编写一个loginSerlvet处理登录请求:

package com.igeek.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet{

    @Override

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

       //处理登录请求

       System.out.println("登录的servlet 处理登录请求");

       //获取请求参数

       String uname = request.getParameter("uname");

       String upass = request.getParameter("upass");

       System.out.println("用户名:"+uname+";密码:"+upass);

       //响应客户端

       response.setContentType("text/html;charset=utf-8");

       //获取输出流

       PrintWriter writer = response.getWriter();

       //输出对应的字符串

       if("admin".equals(uname) && "123123".equals(upass)) {

           writer.write("<h1>登录成功</h1>");

       }else {

           writer.write("<h1>登录失败</h1>");

       }

       //释放资源

       writer.close();

    }

}

 

配置:

    <!-- 配置登录的servlet -->

    <servlet>

       <servlet-name>loginServlet</servlet-name>

       <servlet-class>com.igeek.servlet.LoginServlet</servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>loginServlet</servlet-name>

       <url-pattern>/login</url-pattern>

    </servlet-mapping>

 

修改html页面的表单的action,action中配置url-pattern的值

 

提交表单:

Tips:

url发生了变化

url“?“后携带的是请求参数。请求参数按照 paramName=paramValue&pname=pvalue…

在后台可以通过request.getParameter获取请求参数。

 

需要注意的一个细节:表单域中的name属性的值就是请求参数的name

创建数据库webcore

创建数据表:

-- 创建用户表 --

create table Account(

    accountId int  primary key auto_increment,

    accountName varchar(50) not null,

    loginName varchar(50) not null unique,

    loginPass varchar(50) not null,

    createTime datetime not null,

    accountTel char(11),

    accountGender int default '0',

    accountEmail varchar(100),

    accountMark varchar(500)

);

 

-- 添加用户 --

insert into account(accountName,loginName,loginPass,createTime,accountTel,accountGender,accountEmail,accountMark)

values('卡卡西','admin','123123',now(),'13813813838',default,'kakaxi@igeek.com','是一个很强大的忍者');

 

 

根据数据表创建对应的实体类:

public class Account {

    private int accountId;

    private String accountName;

    private String loginName;

    private String loginPass;

    private String createTime;

    private String accountTel;

    private int accountGender;

    private String accountEmail;

    private String accountMark;

   //省略set和get方法

}

 

添加数据库连接相关的jar文件

Web项目中将jar添加到WEB-INF/lib文件夹中即可

添加工具类和连接的配置文件:

修改配置文件

url=jdbc:mysql://localhost:3306/webcore

username=root

password=root

initialSize=3

maxActive=20

 

添加一个AccountDAO类,添加根据用户登录名查询用户的方法:

package com.igeek.dao;

 

import java.sql.SQLException;

 

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;

 

import com.igeek.pojo.Account;

import com.igeek.util.JDBCUtils;

 

public class AccountDAO {

    public Account queryByLoginName(String loginName) {

       String sql = "select * from account where loginName=?";

       QueryRunner runner = new QueryRunner();

       Account account = null;

       try {

           account = runner.query (JDBCUtils.getCon(), sql,new BeanHandler<Account>(Account.class),loginName);

       } catch (Exception e) {

           e.printStackTrace();

       }

       return account;

    }

}

 

编写一个service实现登录业务:

package com.igeek.service;

 

import com.igeek.dao.AccountDAO;

import com.igeek.pojo.Account;

 

public class AccountService {

   

    private AccountDAO accountDAO = new AccountDAO();

   

    /**

     * 用户登录

     * @param loginName

     * @param loginPass

     * @return 如果登录失败就返回null 如果成功就返回登录的Account对象

     */

    public Account login(String loginName,String loginPass) {

       //通过登录名称查询用户

       Account account = accountDAO.queryByLoginName(loginName);

       if(account == null) {

           //通过登录名称查询失败,说明登录名称错误

           return null;

       }

       //如果登录名称正确,则比对登录密码

       if(account.getLoginPass().equals(loginPass)) {

           //密码一致就登录成功

           return account;

       }

       return null;

    };

}

 

 

修改servlet,在servlet的doGet方法中调用service判断登录结果

package com.igeek.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.igeek.pojo.Account;

import com.igeek.service.AccountService;

 

public class LoginServlet extends HttpServlet{

   

    private AccountService service = new AccountService();

    @Override

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

       //处理登录请求

       System.out.println("登录的servlet 处理登录请求");

       //获取请求参数

       String uname = request.getParameter("uname");

       String upass = request.getParameter("upass");

       System.out.println("用户名:"+uname+";密码:"+upass);

       //调用service登录  ,调用login方法,传入unameupass

       Account account = service.login(uname, upass);

       //响应客户端

       response.setContentType("text/html;charset=utf-8");

       //获取输出流

       PrintWriter writer = response.getWriter();

       //判断account是否为null,输出对应的字符串

       if(account!=null) {

           writer.write("<h1>登录成功</h1>");

       }else {

           writer.write("<h1>登录失败</h1>");

       }

       //释放资源

       writer.close();

    }

}

 

 

登录测试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值