Servlet(二)

Servlet 如何获取浏览器提交的参数

通过登录行为,演示servlet如何获取从浏览器提交的账号密码

在web中创建login.html

<!DOCTYPE html>     //声明文档的解析类型为标准类型,页面在所有的浏览器里显示的就都是一个样子了

<html>

<head>

<meta charset="UTF-8">

<title>登录页面</title>

</head>

<body>

  

添加一个form元素action="login" 标题会提交到login路径,会映射到LoginServlet,post表示提交的信息在地址栏看不到

<form action="login" method="post">   

准备账号和密码的input元素
因为要提交两个数据,在servlet端为了区分哪个是账号,哪个是密码,要给这两个input元素的name属性分别叫做name和password。

账号: <input type="text" name="name"> <br>

密码: <input type="password" name="password"> <br>

<input type="submit" value="登录">

</form>

  

</body>

</html>

创建 LoginServlet

创建一个LoginServlet

因为浏览器中的form的method是post,所以LoginServlet需要提供一个doPost方法

在doPost方法中,通过request.getParameter 根据name取出对应的账号和密码

然后用System.out.println() 打印在控制台(不是网页)

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 loginServlet extends HttpServlet{
	protected void doPost(HttpServletRequest request,HttpServletResponse response) 
			throws ServletException, IOException{ 
		String name = request.getParameter("name");
		String password = request.getParameter("pasword");
	
		System.out.println("name:"+name);
		System.out.println("password:"+password);
	}
}

映射LoginServlet到路径login

在web.xml中新增映射

<servlet>

        <servlet-name>LoginServlet</servlet-name>

        <servlet-class>LoginServlet</servlet-class>

    </servlet>

 

    <servlet-mapping>

        <servlet-name>LoginServlet</servlet-name>

        <url-pattern>/login</url-pattern>

    </servlet-mapping>   

 

判断账号密码是否为 admin 123,如果是就打印
success 否则就打印 fail

根据账号密码,创建对应的html字符串。

然后通过response.getWriter().println() 发送到浏览器。


注: 比较的时候把常量字符串"admin" "123"放前面,因为用户可能没有输入账号密码就提交,servlet会获取到null。 这样就规避了空指针异常的问题。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        String name = request.getParameter("name");
        String password = request.getParameter("password");
  
        String html = null;
  
        if ("admin".equals(name) && "123".equals(password))
            html = "<div style='color:green'>success</div>";
        else
            html = "<div style='color:red'>fail</div>";
  
        PrintWriter pw = response.getWriter();
        pw.println(html);
  
    }
  
}

 

二、ServletConfig讲解

流程图

首先访问

http://127.0.0.1/login.html



打开一个静态的html页面,在这个页面中可以通过form,以post的形式提交数据  

在上一步的login.html中,用form,把账号和密码,提交到/login这个路径,并且附带method="post"

tomcat接受到一个新的请求:

http://127.0.0.1/login


其路径是/login,接着就到配置文件web.xml进行匹配,发现/login,对应的Servlet类是 LoginServlet。
接下来的工作,就会基于这个LoginServlet进行。

找到对应的Servlet

实例化Servlet对象

  Tomcat定位到了LoginServlet后,发现并没有LoginServlet的实例存在,于是就调用LoginServlet的public无参的构造方法LoginServlet()实例化一个LoginServlet对象以备后续使用  

调用doGet或者doPost

    Tomcat从上一步拿到了LoginServlet的实例之后,根据页面login.html提交信息的时候带的method="post",去调用对应的doPost方法。

request获取参数

         在这个方法中,通过参数request,把页面上传递来的账号和密码信息取出来

String name = request.getParameter("name");

String password = request.getParameter("password");

response设置响应

接着,根据账号和密码是否正确(判断是否是admin和123), 创建不同的html字符串。

然后把html字符串通过如下方式,设置在了response对象上。

PrintWriter pw = response.getWriter();

pw.println(html);

到这里,Servlet的工作就做完了。

tomcat把html传递给浏览器

在Servlet完成工作之后,tomcat拿到被Servlet修改过的response,根据这个response生成html 字符串,然后再通过HTTP协议,这个html字符串,回发给浏览器,浏览器再根据HTTP协议获取这个html字符串,并渲染在界面上。

这样在效果上,浏览器就可以看到Servlet中生成的字符串了。

 

Servlet 需要提供对应的doGet() 与 doPost()方法

当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法

哪些是get方式呢?

form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候

当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法

哪些是post方式呢?
在form上显示设置 method="post"的时候
ajax指定post方式的时候

LoginServlet继承了HttpServlet,同时也继承了一个方法

service(HttpServletRequest , HttpServletResponse )



实际上,在执行doGet()或者doPost()之前,都会先执行service()

由service()方法进行判断,到底该调用doGet()还是doPost()

可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。

所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。

比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果

获取中文的参数

为了成功获取中文参数,需要做如下操作
1. login.html中加上

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码

2. login.html
form的method修改为post

3.servlet进行处理

request.setCharacterEncoding("UTF-8");


并且把这句话放在request.getParameter()之前

返回中文的响应

在Servlet中,加上

response.setContentType("text/html; charset=UTF-8");

 

 

生命周期

一个Servlet的生命周期由 实例化初始化提供服务销毁被回收 几个步骤组成

生命周期

实例化

只有一次

 

配置Servlet初始化参数

  在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

无论访问了多少次LoginSerlvet
init初始化 只会执行一次

例如:

<servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
     <!--配置初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>cxy</param-value>
    </init-param>
     <init-param>
        <param-name>password</param-name>
        <param-value>123</param-value>
    </init-param>
    <init-param>
        <param-name>charset</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    
    </servlet>

提供服务

销毁

destroy()
在如下几种情况下,会调用destroy()
1. 该Servlet所在的web应用重新启动
在serverl.xml中配置该web应用的时候用到了

<Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />

如果把 reloadable="false" 改为reloadable="true" 就表示有任何类发生的更新,web应用会自动重启
当web应用自动重启的时候,destroy()方法就会被调用

2. 关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现

被回收

当该Servlet被销毁后,就满足垃圾回收的条件了。 当下一次垃圾回收GC来临的时候,就有可能被回收。


这个。。。也是不容易被观察到的现象。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值