前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Web-第八天 Servlet学习【悟空教程】

Web-第八天 Servlet学习【悟空教程】

作者头像
Java帮帮
发布2018-07-27 14:50:59
5260
发布2018-07-27 14:50:59
举报

Web-第八天 Servlet学习

Servlet

今日内容介绍

  • 案例:完成用户登录的功能

今日内容学习目标

  • 可以独立编写Servlet程序
  • 可以使用request接收请求参数
  • 了解ServletConfig的使用

第1章 案例:使用Servlet完成一个用户登录的案例.

1.1 案例需求:

在网站的首页上,登录的链接,点击登录的链接,可以跳转到登录的页面.在登录的页面中输入用户名和密码点击登录的案例.完成登录的功能.

1.2 相关知识点:

1.2.1 Servlet的概述

1.2.1.1 什么是Servlet

Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态资源。

Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),且最重要。

1.2.1.2 Servlet的作用

用来处理从客户端发送过来的请求,并对该请求作出响应。

Servlet的任务有:

1. 获取请求数据

2. 处理请求

3. 完成响应

1.2.2 Servlet的入门

1.2.2.1 准备工作

Servlet规范要求:Servlet程序需要编写实现类,并在web.xml进行配置。

  • 实现类:通常继承javax.servlet.http.HttpServlet类,并复写doGet和doPost方法。
  • doGet()方法用于处理get请求。
  • doPost()方法用于处理post请求。

配置信息:在web.xml进行配置。

阿拉伯语实用口语

作者:北京外国语大学阿拉伯语系《阿拉伯语实用口语》编写组 编

当当 广告

购买

1.2.2.2 编写步骤

1. 创建类,继承HttpServlet,复写doGet和doPost方法

package cn.com.javahelp.demo01.a_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

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("get请求将执行");

}

@Override

public void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("post请求将执行");

}

}

2. 编写配置文件

<!-- demo01 servlet hello start

* <servlet> 注册servlet

<servlet-name> servlet名称,当前xml中唯一

<servlet-class> servlet实现类的全限定类名

* <servlet-mapping> 给注册的servlet添加映射路径

<servlet-name> 已经注册的servlet名称。注意:必须与注册的名称一致。

<url-pattern> 访问路径。要求:必须/开头

-->

<servlet>

<servlet-name>helloServlet</servlet-name>

<servlet-class>cn.com.javahelp.demo01.a_servlet.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>helloServlet</servlet-name>

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

</servlet-mapping>

<!-- demo01 servlet hello end -->

3. 浏览器访问

在浏览器地址栏输入:http://localhost:8080/day13/hello

  • 浏览器显示空白页面
  • 控制打印信息
1.2.2.3 Servlet的执行的流程详解:

1.2.3 Request接收请求参数

1.2.3.1 Request接收请求参数的概述

请求参数

方法名

描述

String getParameter(String name)

获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。例如:username=jack

1.2.3.2 Request接收请求参数入门
  • 编写步骤

1. 编写表单,提供表单字段:username、password、hobby,以post方式提交

<form action="../demo01ParamServlet" method="post">

用户名:<input type="text" name="username" value="jack" /> <br/>

密码:<input type="text" name="password" value="1234" /> <br/>

爱好:<input type="checkbox" name="hobby" value="抽烟" checked="checked"/> 抽烟

<input type="checkbox" name="hobby" value="喝酒" checked="checked" /> 喝酒

<input type="checkbox" name="hobby" value="烫头" /> 烫头 <br/>

<input type="submit" value="post提交" />

</form>

2. 编写Servlet实现类,使用对应方法获得请求参数,并处理POST中文乱码。

public class Demo01ParamServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//0请求参数中文乱码

request.setCharacterEncoding("UTF-8");

//1 使用参数名获得一个值

//1.1 获得用户名

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

//1.2 获得密码

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

System.out.println(username + " : " + password);

//2 使用参数名获得一组值

String[] hobbies = request.getParameterValues("hobby");

System.out.println(Arrays.toString(hobbies));

//3 获得所有数据,遍历Map

System.out.println("---------------");

Map<String,String[]> allData = request.getParameterMap();

for (Map.Entry<String, String[]> entry : allData.entrySet()) {

System.out.print(entry.getKey());

System.out.print( " --> ");

System.out.println(Arrays.toString(entry.getValue()));

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/* 开发中我们发现,doPost和doGet两个方法编写的内容相同

* 所以常使用一个调用另一个,此处我们使用doPost调用doGet

* 所有的内容之后都编写doGet方法中

*/

doGet(request, response);

}

}

3. 编写Servlet,配置文件

<servlet>

<servlet-name>Demo01ParamServlet</servlet-name>

<servlet-class>cn.com.javahelp.demo01.b_request.Demo01ParamServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Demo01ParamServlet</servlet-name>

<url-pattern>/demo01ParamServlet</url-pattern>

</servlet-mapping>

4. 测试,访问“http://localhost:8080/day13/02.request/form.html”,并提交表单。控制台显示

1.3 案例分析

1.4 代码实现

Servlet的代码

public class UserServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

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

try {

// 1.接收表单提交的参数.

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

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

// 2.封装到实体对象中.

User user = new User();

user.setUsername(username);

user.setPassword(password);

// 3.调用业务层处理数据.

UserService userService = new UserService();

User existUser = userService.login(user);

// 4.根据处理结果显示信息(页面跳转).

if(existUser == null){

// 登录失败

response.getWriter().println("Login Fail...");

}else{

// 登录成功

response.getWriter().println("Login Success...");

}

} catch (Exception e) {

e.printStackTrace();

}

}

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

doGet(request, response);

}

}

Service的代码:

public class UserService {

/**

* 业务层用户登录的方法:

* @param user

* @return

* @throws SQLException

*/

public User login(User user) throws SQLException {

// 调用DAO完成对数据库查询的操作:

UserDao userDao = new UserDao();

return userDao.login(user);

}

}

DAO的代码

public class UserDao {

/**

* 用户登录的DAO的方法:

* @param user

* @return

* @throws SQLException

*/

public User login(User user) throws SQLException {

QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());

String sql = "select * from user where username =? and password = ?";

User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());

return existUser;

}

}

1.5 总结:

1.5.1 Servlet的生命周期:

  • 生命周期:就是一个对象从创建到销毁的过程.
  • Servlet生命周期:Servlet从创建到销毁的过程.
    • 何时创建:用户第一次访问Servlet创建Servlet的实例 (单实例)
    • 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
  • Servlet规范规定,所有的servlet必须实现 javax.servlet.Servlet接口。

1.第一次调用时,将执行初始化方法:init(ServletConfig)

2.每一次调用,都将执行service(ServletRequest,ServletResponse)方法

3.服务器关闭,或项目移除:destroy()方法

  • JavaEE规范中提供Servlet接口实现类:
    • GenericServlet:通用servlet实现。没有实现service
    • HttpServlet:与Http协议有关的实现。实现service方法,完成与http协议有关的操作。

request.getMethod() 获得请求方式(get、post)

如果是get,将调用doGet()

如果是post,将调用doPost()

  • servlet被访问过程描述

1. 用户第一次访问Servlet的时候,首先服务器会创建一个Servlet的实例

2. 创建servlet实例同时执行Servlet的init方法。

3. 然后,每一次请求服务器都会创建一个新的线程访问Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doXxx的方法(get请求调用doGet,post请求调用doPost)。

4. 当Servlet从服务器中被移除,或者关闭服务器,Servlet的实例就会被销毁,同时destroy方法将会执行。

1.5.2 Servlet的相关的配置:

1.5.2.1 【启动时创建Servlet】

Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:

在web.xml中在<servlet></servlet>标签中配置:

* <load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.

1.5.2.2 【url-pattern的配置】

url-pattern配置方式共有三种:

1.完全路径匹配 :以 / 开始

例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6

2.目录匹配 :以 / 开始 需要以 * 结束.

例如: /* (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*

3.扩展名匹配 :不能以 / 开始 以 * 开始的. 例如: *.do , *.action 、*.jsp 、*.jpg

***** 错误的写法 : /*.do

4.缺省路径 /

通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet

tomcat获得匹配路径时,优先级顺序:1 > 2 > 3 > 4

有如下的配置:

<servlet>

<servlet-name>ServletDemo4</servlet-name>

<servlet-class>cn.com.javahelp.a_servlet.ServletDemo4</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ServletDemo4</servlet-name>

<url-pattern>/ServletDemo4</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>ServletDemo5</servlet-name>

<servlet-class>cn.com.javahelp.a_servlet.ServletDemo5</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ServletDemo5</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>ServletDemo6</servlet-name>

<servlet-class>cn.com.javahelp.a_servlet.ServletDemo6</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ServletDemo6</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

如果访问地址:

http://localhost:8080/day13/ServletDemo4 :第一个

http://localhost:8080/day13/aaa.do :第二个

***** 完全路径匹配 > 目录匹配 > 扩展名匹配

1.5.3 开发中的路径的编写:

  • 相对路径:都是需要找位置相对关系.不能以 / 开始的.

* ./ 当前路径 ../上一级目录

* 使用相对路径访问:

* http://localhost:8080/day13/demo4-url/demo1.html

* http://localhost:8080/day13/ServletDemo6

  • 绝对路径:不需要找位置相对关系. 以 / 开始的.

* 绝对路径中分为客户端路径和服务器端路径:

* 客户端路径一定要加工程名. /day13/ServletDemo6

* 服务器端路径不需要加工程名. /ServletDemo6

1.5.4 ServletConfig:获得Servlet的配置信息(了解)

方法名

返回值类型

描述

getInitParameter(name)

String

获得Servlet的初始化参数的

getInitParameterNames()

Enumeration

获得所有Servlet的初始化参数的名称

getServletContext()

ServletContext

获得ServletContext对象的引用

getServletName()

String

获得Servlet在web.xml中配置的name的值。及<servlet-name>标签配置内容。

  • servlet的初始化参数

第2章 总结

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Servlet
  • 第1章 案例:使用Servlet完成一个用户登录的案例.
    • 1.1 案例需求:
      • 1.2 相关知识点:
        • 1.2.1 Servlet的概述
        • 1.2.2 Servlet的入门
      • 阿拉伯语实用口语
        • 1.2.3 Request接收请求参数
      • 1.3 案例分析
        • 1.4 代码实现
          • 1.5 总结:
            • 1.5.1 Servlet的生命周期:
            • 1.5.2 Servlet的相关的配置:
            • 1.5.3 开发中的路径的编写:
            • 1.5.4 ServletConfig:获得Servlet的配置信息(了解)
        • 第2章 总结
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档