天天看点

JavaWeb学习笔记——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.test.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.test.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.test.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.test.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=test&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.

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