学习笔记(二)Eclipse设置 Servlet配置及初始化参数读取 及Servlet应用

1. 使用 JavaEE 版的 Eclipse 开发动态的 WEB 工程(JavaWEB 项目)
1). 把开发选项切换到 JavaEE
2). 可以在 Window -> Show View 中找到 Package Explorer, 并把其拖拽到开发区的左边
3). 在 Servers 面板中新建 Tomcat 服务器. 一定要关联到 Tomcat 安装的根目录
4). 新建一个 Dynamic Web Project. 其中 Target Runtime 需选择 Tomcat6.0
5). 开发 Java WEB 应用
6). 可以通过 run on server  来运行 WEB 项目.

2. Servlet 的 HelloWorld
1). 创建一个 Servlet 接口的实现类.
public class HelloServlet implements Servlet

2). 在 web.xml 文件中配置和映射这个 Servlet

<!-- 配置和映射 Servlet -->
 <servlet>
  <!-- Servlet 注册的名字 -->
  <servlet-name>helloServlet</servlet-name>
  <!-- Servlet 的全类名 -->
  <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
  <servlet-name>helloServlet</servlet-name>
  <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>

3. Servlet 容器: 运行 Servlet、JSP、Filter 等的软件环境.
1). 可以来创建 Servlet, 并调用 Servlet 的相关生命周期方法.
2). JSP, Filter, Listener, Tag ...

4. Servlet 生命周期的方法: 以下方法都是由 Serlvet 容器负责调用.
1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器.
这说明 Serlvet 的单实例的!
2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet.
3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的.
4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源.

5. load-on-startup 参数:
1).  配置在 servlet 节点中:

<servlet>
  <!-- Servlet 注册的名字 -->
  <servlet-name>secondServlet</servlet-name>
  <!-- Servlet 的全类名 -->
  <servlet-class>com.atguigu.javaweb.SecondServlet</servlet-class>
  <!-- 可以指定 Servlet 被创建的时机 -->
  <load-on-startup>2</load-on-startup>
 </servlet>
 
2). load-on-startup: 可以指定 Serlvet 被创建的时机. 若为负数, 则在第一次请求时被创建.若为 0 或正数, 则在当前 WEB 应用被
Serlvet 容器加载时创建实例, 且数组越小越早被创建.

6. 关于 serlvet-mapping:

1). 同一个Servlet可以被映射到多个URL上,即多个 <servlet-mapping> 元素的<servlet-name>子元素的设置值可以是同一个
Servlet的注册名。

2). 在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:
一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>/*</url-pattern>
</servlet-mapping>

OR

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>

注意: 以下的既带 / 又带扩展名的不合法.

<servlet-mapping>
 <servlet-name>secondServlet</servlet-name>
 <url-pattern>/*.action</url-pattern>
</servlet-mapping>

7. ServletConfig: 封装了 Serlvet 的配置信息, 并且可以获取 ServletContext 对象

1). 配置 Serlvet 的初始化参数

<servlet>
  <servlet-name>helloServlet</servlet-name>
  <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>
  
  <!-- 配置 Serlvet 的初始化参数。 且节点必须在 load-on-startup 节点的前面 -->
  <init-param>
   <!-- 参数名 -->
   <param-name>user</param-name>
   <!-- 参数值 -->
   <param-value>root</param-value>
  </init-param>
  
  <init-param>
   <param-name>password</param-name>
   <param-value>1230</param-value>
  </init-param>
  
  <load-on-startup>-1</load-on-startup>
  
 </servlet>

2). 获取初始化参数:

> getInitParameter(String name): 获取指定参数名的初始化参数
    > getInitParameterNames(): 获取参数名组成的 Enumeration 对象.
   
    String user = servletConfig.getInitParameter("user");
 System.out.println("user: " + user);
 
 Enumeration<String> names = servletConfig.getInitParameterNames();
 while(names.hasMoreElements()){
  String name = names.nextElement();
  String value = servletConfig.getInitParameter(name);
  System.out.println("^^" + name + ": " + value);
 }

3). 获取 Serlvet 的配置名称(了解)

8. ServletContext

1). 可以由  SerlvetConfig 获取:

ServletContext servletContext = servletConfig.getServletContext();

2). 该对象代表当前 WEB 应用: 可以认为 SerlvetContext 是当前 WEB 应用的一个大管家. 可以从中获取到当前 WEB 应用的各个方面的信息.

①. 获取当前 WEB 应用的初始化参数

设置初始化参数: 可以为所有的 Servlet 所获取, 而 Servlet 的初始化参数只用那个 Serlvet 可以获取.

<!-- 配置当前 WEB 应用的初始化参数 -->
<context-param>
 <param-name>driver</param-name>
 <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

方法:

getInitParameter
getInitParameterNames

代码:

ServletContext servletContext = servletConfig.getServletContext();
  
String driver = servletContext.getInitParameter("driver");
System.out.println("driver:" + driver);

Enumeration<String> names2 = servletContext.getInitParameterNames();
while(names2.hasMoreElements()){
 String name = names2.nextElement();
 System.out.println("-->" + name);
}

②. 获取当前 WEB 应用的某一个文件在服务器上的绝对路径, 而不是部署前的路径

getRealPath(String path);

代码:

String realPath = servletContext.getRealPath("/note.txt");
System.out.println(realPath);

③. 获取当前 WEB 应用的名称:

getContextPath()

代码:

String contextPath = servletContext.getContextPath();
System.out.println(contextPath);

④. 获取当前 WEB 应用的某一个文件对应的输入流.

getResourceAsStream(String path): path 的 / 为当前 WEB 应用的根目录.

代码:

InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
 
⑤. 和 attribute 相关的几个方法:

9. GET 请求和 POST 请求:

1). 使用GET方式传递参数:

①. 在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。
②. 如果网页中的<form>表单元素的 method 属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
③. 使用GET请求方式给WEB服务器传递参数的格式:

http://www.atguigu.com/counter.jsp?name=lc&password=123

④. 使用GET方式传送的数据量一般限制在 1KB 以下。

2). 使用 POST 方式传递参数:

①. POST 请求方式主要用于向 WEB 服务器端程序提交 FORM 表单中的数据: form 表单的 method 置为 POST
②. POST 方式将各个表单字段元素及其数据作为 HTTP 消息的实体内容发送给 WEB 服务器,传送的数据量要比使用GET方式传送的数据量大得多。

POST /counter.jsp HTTP/1.1
referer: http://localhost:8080/Register.html
content-type: application/x-www-form-urlencoded
host: localhost:8080
content-length: 43

name=zhangsan&password=123              --请求体中传递参数.

10. 如何在 Serlvet 中获取请求信息:

1). Servlet 的 service() 方法用于应答请求: 因为每次请求都会调用 service() 方法

public void service(ServletRequest request, ServletResponse response)
   throws ServletException, IOException
   
ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.
ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.

这两个接口的实现类都是服务器给予实现的, 并在服务器调用 service 方法时传入.

2). ServletRequest: 封装了请求信息. 可以从中获取到任何的请求信息.

①. 获取请求参数:

> String getParameter(String name): 根据请求参数的名字, 返回参数值.
 若请求参数有多个值(例如 checkbox), 该方法只能获取到第一个提交的值.

> String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组.
 
 > Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,
 类似于 ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.

> Map getParameterMap(): 返回请求参数的键值对: key: 参数名,  value: 参数值, String 数组类型.

②. 获取请求的 URI:

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  
 String requestURI = httpServletRequest.getRequestURI();
 System.out.println(requestURI); //  /day_29/loginServlet

③. 获取请求方式:

String method = httpServletRequest.getMethod();
 System.out.println(method); //GET
 
④. 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.

String queryString = httpServletRequest.getQueryString();
 System.out.println(queryString); //user=atguigu&password=123456&interesting=game&interesting=party&interesting=shopping

⑤. 获取请求的 Serlvet 的映射路径
 
   String servletPath = httpServletRequest.getServletPath();
   System.out.println(servletPath);  //  /loginServlet
  
⑥. 和 attribute 相关的几个方法:

3). HttpServletRequest: 是 SerlvetRequest 的子接口. 针对于 HTTP 请求所定义. 里边包含了大量获取 HTTP 请求相关的方法.
 
4). ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现.

①. *getWriter(): 返回 PrintWriter 对象. 调用该对象的 print() 方法, 将把 print() 中的参数直接打印
到客户的浏览器上.

②. 设置响应的内容类型: response.setContentType("application/msword");

③. void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)

-----------------------------------------------------------------------------

在 web.xml 文件中设置两个 WEB 应用的初始化参数, user, password.
定义一个 login.html, 里边定义两个请求字段: user, password. 发送请求到 loginServlet
在创建一个 LoginServlet, 在其中获取请求的 user, password. 比对其和 web.xml 文件中定义的请求参数是否一致
若一致, 响应 Hello:xxx, 若不一致, 响应 Sorry: xxx  xxx 为 user.

-----------------------------------------------------------------------------

时间: 2024-10-06 21:39:41

学习笔记(二)Eclipse设置 Servlet配置及初始化参数读取 及Servlet应用的相关文章

openstack学习笔记二 网络设置基础

租用这个服务的机构,我们称之"租户/tenant/项目/project" 租户  用户 vxlan划分租户 [[email protected] ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00     inet 127.0.0.1/8 scope h

linux学习笔记二:设置主机名hostname

使用hostnamectl命令,或修改/etc/hosts./etc/sysconfig/network文件.对于centos7,修改/etc/hostname文件.

angular学习笔记(二十六)-$http(4)-设置请求超时

本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错误 demo: html: <!DOCTYPE html> <html ng-app = 'HttpGet'> <head> <title>18.4 $http(2)</title> <meta charset="utf-8"

angular学习笔记(二十四)-$http(2)-设置http请求头

1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 2. 修改默认请求头: (1) 全局修改(整个模块) 使用$httpProvider依赖 var myApp = angular.module('MyApp',[]); myApp.config(function($httpProvider){ console.log($httpProvider.defaults.headers.common) //修改/操作$httpProv

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

Hadoop学习笔记0004——eclipse安装hadoop插件

Hadoop学习笔记0004--eclipse安装hadoop插件 1.下载hadoop-1.2.1.tar.gz,解压到win7下hadoop-1.2.1: 2.如果hadoop-1.2.1中没有hadoop-eclipse-plugin-1.2.1.jar包,就到网上下载下来: 3.关闭eclipse,然后将hadoop-eclipse-plugin-1.2.1.jar拷贝到eclipse安装目录下的eclipse-x.x\plugins文件夹下,重启eclipse 4.在eclipse中顶

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

马哥学习笔记二十一——LVS DR模型

kernel parameter: arp_ignore: 定义接收到ARP请求时的响应级别: 0:只要本地配置的有相应地址,就给予响应: 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应: arp_announce:定义将自己地址向外通告时的通告级别: 0:将本地任何接口上的任何地址向外通告: 1:试图仅向目标网络通告与其网络匹配的地址: 2:仅向与本地接口上地址匹配的网络进行通告: curl命令选项: --cacert <file> CA证书 (SSL) --capath &l