JavaWeb 笔记之 Servlet

Get和Post区别

  • GET 方法有大小长度限制:请求字符串中最多有1024个字符(1KB)
  • POST 方法 各个表单字段元素及其数据作为 HTTP 消息的实体内容发送给 WEB 服务器,传送的数据量要比使用GET方式传送的数据量大得多。

1、Servlet容器

运行 Servlet、JSP、Filter 等的软件环境。

  • 可以创建 Servlet 实例,并调用Servlet相关的生命周起方法。
  • JSP、Filter、Listener,Tag...

2、Servlet的生命周期方法

1.构造器:只被调用一次,只有第一次请求 Servlet 时,创建 Servlet 实例,调用构造器(这说明 Servlet 是单例的)

2.init 方法:只被调用一次。在创建好实例后立即被调用, 用于初始化当前的 Servlet 实例,简单的创建一些用于整个生命周期的数据

3.Service 方法:被多次调用。每次请求都会调用 Service 方法,实际用于处理客户端的请求。(检查HTTP请求类型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet、doPost、doPut、doDelete 等方法。)

4.destory:只被调用一次,在当前 Servlet 所在的Web应用被卸载时调用,用于释放当前 Servlet 所占用的资源。


3、Servlet 的 HelloWrold:

  1. 创建一个 Servlet 接口的实例;
  2. 在 web.xml 中配置和映射这个 Servlet:
<!-- 配置和映射 Servlet -->
<servlet>
    <!-- Servlet 注册的名字 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- Servlet 的全类名 -->
    <servlet-class>com.wbc.j2ee.HelloServlet</servlet-class>
</servlet>
	
<servlet-mapping>
    <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
    <servlet-name>helloServlet</servlet-name>
    <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

4、load-on-startup 参数

配置在 servlet 节点中:指定Servlet被创建的时机。若为负数,则第一个请求时被创建。若为正数或0,则在当前WEB应用被Servlet 容器加载时创建实例,且数值越小越早被创建。

    <servlet>
		<!-- Servlet 注册的名字 -->
		<servlet-name>xxx</servlet-name>
		<!-- Servlet 的全类名 -->
		<servlet-class>xxxxx</servlet-class>
		<!-- 可以指定 Servlet 被创建的时机 -->
		<load-on-startup>2</load-on-startup>
	</servlet>

5、关于Servlet-mapping:

  • 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
  • 在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>

6、ServletConfig

1. 配置 Serlvet 的初始化参数

        <servlet>
		<servlet-name>helloServlet</servlet-name>
		<servlet-class>xxx.xxx.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);
}

7、ServletContext

代表当前WEB应用,是当前WEB应用的一个大管家,可以从中获取WEB应用各个方面的信息 可以由 SerlvetConfig 获取:

ServletContext servletContext = servletConfig.getServletContext();

1. 获取当前 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); 
}

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

getRealPath(String path);

String realPath = servletContext.getRealPath("/note.txt");
System.out.println(realPath);
  • 获取当前 WEB 应用的名称: ** getContextPath()**
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);

3. 利用ServletContext对象读取资源文件(比如properties文件)

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

读取资源文件要根据资源文件所在的位置来决定,一般分为以下两种情况:

  1. 文件在WebRoot文件夹下,即Web应用的根目录。这时候我们可以使用ServletContext来读取该资源文。

假设我们Web根目录下有一个配置数据库信息的dbinfo.properties文件,里面配置了name和password属性,这时候可以通过ServletContext去读取这个文件:

// 这种方法的默认读取路径就是Web应用的根目录
InputStream stream = this.getServletContext().getResourceAsStream("dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
properties.load(stream);
String name = properties.getProperty("name");
String password = properties.getProperty("password");
out.println("name="+name+";password="+password);
  1. 如果这个文件放在了src目录下,这时就不能用ServletContext来读取了,必须要使用类加载器去读取
// 类加载器的默认读取路径是src根目录
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("dbinfo.properties")
如果这个文件此时还没有直接在src目录下,而是在src目录下的某个包下,比如在com.gavin包下,此时类加载器要加上包的路径,如下:
InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/gavin/dbinfo.properties")

补充一点,ServletContext只有在读取的文件在web应用的根目录下时,才能获取文件的全路径。比如我们在WebRoot文件夹下有一个images文件夹,images文件夹下有一个Servlet.jpg图片,为了得到这个图片的全路径,如下:

// 如何读取到一个文件的全路径,这里会得到在Tomcat的全路径
String path = this.getServletContext().getRealPath("/images/Servlet.jpg");

8、Servlet中获取请求消息

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

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

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); 
  • 获取请求方式:
        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("text/html");
  • void sendRedirect(String location): 请求的重定向. (此方法为 HttpServletResponse 中定义.)

猜你喜欢

转载自blog.csdn.net/wm1203618455/article/details/82501489