注册用户享全站资源 并成为粉丝 不定时福利发放
合作广告

合作广告

最大优惠

人事面试

人事面试

套路太深

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

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

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

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

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

程序人生

程序人生

技术的另一面

女程序员这一物种是稀有物种,茫茫软件工程系,放眼望去满眼尽收“屌丝男士”。零星几只女性就显得尤为珍贵。这里有只女程...

你是否曾经遇到过这样的情况:你已经有了一个好主意,比如开发一个在线商店,制作一个应用等等,但是却只缺一个程序员,能...

在北京四环路西北部的中关村,聚集了这座城市最多的科技企业和最优秀的技术人员,因为腾讯、字节跳动等互联网巨头坐落于此...

作者 : 何俊林 王小波在《黄金时代》里写道,“那一天我二十一岁,在我一生的黄金时代。我有好多奢望。我想爱,想吃,...

在Stack Overflow上有这样的一个贴子《What’s your most controversial p...

程序员段子

程序员段子

乐一乐

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

足够自信的程序猿自信是通往成功路上的指明灯,自信的程序员更是加班夜里的探照灯,总能让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章 总结


Java帮帮公众号生态

Java帮帮公众号生态

总有一款适合你

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

Python帮帮-公众号

Python帮帮-公众号

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

大数据驿站-微信公众号

大数据驿站-微信公众号

一起在数据中成长

九点编程-公众号

九点编程-公众号

深夜九点学编程

程序员服务区-公众号

程序员服务区-公众号

吃喝玩乐,听学吐画

Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
合作品牌 非盈利生态-优质内容分享传播者
关于我们
友链申请
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
全站内容非商业用途,内容来源于网友,并遵循 CC BY-NC 4.0 许可,如有异议请联系客服。
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部