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

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章 总结

本文分享自微信公众号 - Java帮帮(javahelp)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

Servlet第三篇【request和response介绍、response的常见应用】

response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的respon...

85870
来自专栏Android先生

OKHttp源码解析--初阶

这段时间老李的新公司要更换网络层,知道现在主流网络层的模式是RxJava+Retrofit+OKHttp,所以老李开始研究这三个项目的源代码,在更换网络层后,开...

14520
来自专栏jeremy的技术点滴

获取后台任务进度的另类办法

66560
来自专栏西安-晁州

webservice随记

WebService:跨平台、系统、跨语言间相互调用 CXF: Axis(Apache)-> Axis2(Apache) XFire -> CXF(Celt...

26800
来自专栏Vamei实验室

Java网络03 Servlet沙拉

Servlet开胃酒中介绍了Servlet的基本流程和设置方式。这里,我们将看一些Servlet实例。这些实例都是HTTP通信(参考HTTP协议)中的常见问题。...

21180
来自专栏别先生

初识Jsp,JavaBean,Servlet以及一个简单mvc模式的登录界面

1:JSP JSP的基本语法: 指令标识page,include,taglib; page指令标识常用的属性包含Language用来定义要使用的脚本语言;con...

53460
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十五天 Ajax学习【悟空教程】

在实际开发中,完成注册功能前,如果用户填写用户信息,准备填写其他信息时,将提示当前用户的用户名是否可用。效果图如下:

14230
来自专栏静默虚空的博客

[JavaEE笔记]Cookie

引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话。常用会话跟踪技术...

25260
来自专栏王金龙的专栏

Jedis与Redisson选型对比

54540
来自专栏微信公众号:Java团长

Java Web学习总结(五)——Servlet开发(一)

  Servlet是sun公司提供的一门用于开发动态web资源的技术。   Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(...

11810

扫码关注云+社区

领取腾讯云代金券