Servlet(一)

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">

   

    <display-name>day01_demo1display-name>

   

    <welcome-file-list>

       <welcome-file>index.htmlwelcome-file>

    welcome-file-list>

   

    <servlet>

      

       <servlet-name>HelloServletservlet-name>

      

       <servlet-class>com.igeek.servlet.HelloServletservlet-class>

    servlet>

   

    <servlet-mapping>

      

       <servlet-name>HelloServletservlet-name>

      

       <url-pattern>/hellourl-pattern>

    servlet-mapping>

web-app>

 

 

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

 

控制台输出:

 

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

 

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

 

1.3.1Servlet的配置

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

Servlet(一)_第1张图片

 

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

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

其中的子标签:

必须配置的标签:

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

可选标签:

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

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

S2:配置servlet的映射,访问方式。

其中字标签

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

url-pattern配置访问模式。

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

Servlet(一)_第2张图片

 

1.3.2servlet的执行流程

访问servlet:

流程:

Servlet(一)_第3张图片

请求服务器

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 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("

响应客户端--HelloServlet

");

       //释放资源

       writer.close();

    }

}

 

浏览器中的请求:

响应头消息:

 

后台控制台中:

Servlet(一)_第4张图片

 

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

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

DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title heretitle>

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>

 

测试页面:

Servlet(一)_第5张图片

 

编写一个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("

登录成功

");

       }else {

           writer.write("

登录失败

");

       }

       //释放资源

       writer.close();

    }

}

 

配置:

   

    <servlet>

       <servlet-name>loginServletservlet-name>

       <servlet-class>com.igeek.servlet.LoginServletservlet-class>

    servlet>

    <servlet-mapping>

       <servlet-name>loginServletservlet-name>

       <url-pattern>/loginurl-pattern>

    servlet-mapping>

 

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

Servlet(一)_第6张图片

 

提交表单:

Tips:

url发生了变化

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

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

 

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

Servlet(一)_第7张图片

创建数据库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,'[email protected]','是一个很强大的忍者');

 

 

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

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.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("

登录成功

");

       }else {

           writer.write("

登录失败

");

       }

       //释放资源

       writer.close();

    }

}

 

 

登录测试:

你可能感兴趣的:(Servlet(一))