注册用户享全站资源 并成为粉丝 不定时福利发放
 
非盈利性学习社区
分享网站

分享网站

让更多人可以获取免费教程

合作广告

合作广告

最大优惠

人事面试

人事面试

套路太深

面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据。对应聘者而言,了解这些问题背...

部分企业人事部收到求职者简历后,会预先进行一轮电话面试,来考察求职者的综合素质,因此了解懂得求职面试的基本技巧,将...

1、着装要适当  穿着不一定要名贵,但一定要合体、干净、整洁,而且颜色和图案的搭配一定要协调。鞋子应该是舒服而又引...

一、隐瞒真实个人资料的不诚实者简历是求职的第一步,只有面试官对你的简历有兴趣才会通知你面试。在简历中适当地突出个人...

一、首先你得已经成为公司里“最好”的程序员,或者你已经找不到可作为老师和导师的人关于这一点,很多人都会过度自信,所...

程序人生

程序人生

技术的另一面

程序员不是你们眼中的程序猿-后IT时代。程序猿是一种非常特殊的、可以从事程序开发、维护的动物。

1.某程序员的QQ签名:为API生,为框架死,为debug奋斗一辈子,吃符号亏,上大小写的当,最后死在需求上2.去...

Web应用,最常见的研发语言是Java和PHP。后端服务,最常见的研发语言是Java和C/C++。大数据,最常见的...

1、第一份工作的选择很重要。不要想着我没有选择的机会,有份工作就不错了,现实情况是进了一行,想出来很难,想转行更难...

       本文摘自一位工作五年程序老哥的演讲。演讲大概讲了他走过的五年时光,反思自己的职业工作,反思自己的生...

程序员段子

程序员段子

乐一乐

皇上太拼了......  被电视剧蒙骗了好多年,三观毁灭!  这是传说中“帅气的王爷”与“美腻的王妃”,像不像屠夫...

足够自信的程序猿自信是通往成功路上的指明灯,自信的程序员更是加班夜里的探照灯,总能让BUG无所遁形。效率高的程序猿...

最近这段时间,小编絮絮叨叨说了很多严肃的东西,今天说点好玩的,轻松一下。娱乐圈有潜规则,小编认为IT圈一样,也有潜...

今天来说说一位女青年的老公以及他们的事儿。如有雷同,纯属巧合。十一年前我和程序猿第一次见面,还是大一军训期间。我甚...

公司高层公司副总A:咱们开个会研究一下这个事情怎么处理。公司副总B:如果老板没有救成功,下任是谁呢?会不会影响公司...

Web-第八天 Servlet学习【悟空教程】
发表时间:2018-11-07 16:17来源:Java帮帮-微信公众号

Servlet

今日内容介绍

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

今日内容学习目标

  • 可以独立编写Servlet程序

  • 可以使用request接收请求参数

  • 了解ServletConfig的使用

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

1.1 案例需求:

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

1.2 相关知识点:

1.2.1 Servlet的概述

1.2.1.1 什么是Servlet

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

ServletJavaWeb三大组件之一(ServletFilterListener),且最重要。

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 {

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

* 所以常使用一个调用另一个,此处我们使用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

获得Servletweb.xml中配置的name的值。

<servlet-name>标签配置内容。

  • servlet的初始化参数


第2章 总结


全部评论(0条)
亲~快来评论噢!
Java帮帮公众号生态

Java帮帮公众号生态

总有一款适合你

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

Python帮帮-公众号

Python帮帮-公众号

人工智能,爬虫,学习教程

大数据驿站-微信公众号

大数据驿站-微信公众号

一起在数据中成长

九点编程-公众号

九点编程-公众号

深夜九点学编程

程序员服务区-公众号

程序员服务区-公众号

吃喝玩乐,听学吐画

Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
战略合作
关于我们
友链申请
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
快速换友链:在你的网站设置好Java帮帮-IT免费资源网友链,截图发给帮主即可
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部