当浏览器使用get方式提交数据的时候,servlet需要提供doGet()方法
哪些是get方式呢?
form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
--
当浏览器使用post方式提交数据的时候,servlet需要提供doPost()方法
哪些是post方式呢?
在form上显示设置 method="post"的时候
ajax指定post方式的时候
--
service(HttpServletRequest , HttpServletResponse )
实际上,在执行doGet()或者doPost()之前,都会先执行service()
由service()方法进行判断,到底该调用doGet()还是doPost()
可以发现,service(), doGet(), doPost() 三种方式的参数列表都是一样的。
所以,有时候也会直接重写service()方法,在其中提供相应的服务,就不用区分到底是get还是post了。
比如把前面的登录的LoginServlet,改为提供service方法,也可以达到相同的效果
--
为了成功获取中文参数,需要做如下操作
1. login.html中加上
这句话的目的是告诉浏览器,等下发消息给服务器的时候,使用UTF-8编码
2. login.html
form的method修改为post
3. 在servlet进行解码和编码
这样就可以得到正确的中文参数了
这样需要对每一个提交的数据都进行编码和解码处理,如果觉得麻烦,也可以使用一句话代替:
以上是使用UTF-8的方式获取中文呢。 也可以使用GBK。把所有的UTF-8替换为GBK即可。 GB2312同理。
Tomcat默认的编码格式是iso-8859-1,不能表示中文字符。这里我们使用UTF-8字符集表示中文。
“page ”指示该页面中代码的字符编码是UTF-8。“head”指示浏览器使用UTF-8格式进行字符显示。
Tomcat进行文件和网络传输操作时,默认使用的编码格式也是iso-8859-1,这里我们指定传输时的编码格式为“UTF-8”。
--
实例化:
为LoginServlet显式提供一个构造方法 LoginServlet()
然后通过浏览器访问,就可以观察到
"LoginServlet 构造方法 被调用"
无论访问了多少次LoginServlet
LoginServlet构造方法 只会执行一次,所以Servlet是单实例的
初始化:
init 方法是一个实例方法,所以会在构造方法执行后执行。
无论访问了多少次LoginSerlvet
init初始化 只会执行一次
提供服务:
接下来就是执行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
在service()中就会编写我们的业务代码,在本例中就是判断用户输入的账号和密码是否正确
销毁
在如下几种情况下,会调用destroy()
1. 该Servlet所在的web应用重新启动
在server.xml中配置该web应用的时候用到了
如果把 reloadable="false" 改为reloadable="true" 就表示有任何类发生的更新,web应用会自动重启
当web应用自动重启的时候,destroy()方法就会被调用
2. 关闭tomcat的时候 destroy()方法会被调用,但是这个一般都发生的很快,不易被发现。
在web.xml中,配置Hello Servlet的地方,增加一句
取值范围是1-99
即表明该Servlet会随着Tomcat的启动而初始化。
同时,为HelloServlet提供一个init(ServletConfig) 方法,验证自启动
如图所示,在tomcat完全启动之前,就打印了init of HelloServlet
<load-on-startup>10</load-on-startup> 中的10表示启动顺序
如果有多个Servlet都配置了自动启动,数字越小,启动的优先级越高
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <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> </web-app>
import java.io.IOException; import java.util.Date; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet{ public void init(ServletConfig config){ System.out.println("init of Hello Servlet"); } public void doGet(HttpServletRequest request, HttpServletResponse response){ try { response.getWriter().println("<h1>Hello Servlet!</h1>"); response.getWriter().println(new Date().toLocaleString()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
<!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <form action="register" method="get"> 账号 : <input type="text" name="name"> <br> 爱好 : LOL<input type="checkbox" name="hobits" value="lol"> DOTA<input type="checkbox" name="hobits" value="dota"> <br> <input type="submit" value="注册"> </form>
import java.io.IOException; import java.util.Arrays; import java.util.Map; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RegisterServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("获取单值参数name:" + request.getParameter("name")); String[] hobits = request.getParameterValues("hobits"); System.out.println("获取具有多值的参数hobits: " + Arrays.asList(hobits)); System.out.println("通过 getParameterMap 遍历所有的参数: "); Map<String, String[]> parameters = request.getParameterMap(); Set<String> paramNames = parameters.keySet(); for (String param : paramNames) { String[] value = parameters.get(param); System.out.println(param + ":" + Arrays.asList(value)); } } }
setAttribute和getAttribute可以用来在进行服务端跳转的时候,在不同的Servlet之间进行数据共享
设置响应编码有两种方式
这两种方式都需要在response.getWriter调用之前执行才能生效。
他们的区别在于
不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文
仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。