Servlet 如何获取浏览器提交的参数
通过登录行为,演示servlet如何获取从浏览器提交的账号密码
在web中创建login.html
添加一个form元素action="login" 标题会提交到login路径,会映射到LoginServlet,post表示提交的信息在地址栏看不到
准备账号和密码的input元素
|
创建 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对象
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来临的时候,就有可能被回收。
这个。。。也是不容易被观察到的现象。