1.servlet的生命周期:
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等, 当服务器决定将实例销毁的时候调用其destroy方法。
2.servlet可以通过web.xml配置
web.xml
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>UserServlet</servlet-name>
<servlet-class>servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/log</url-pattern>
</servlet-mapping>
jsp
<body>
<center>
用户登录<br><br>
<form action="log" method="get">
姓名<input type="text" name="username"><br><br>
密码<input type="text" name="password"><br><br>
<input type="submit" value="登录">
</form>
</center>
</body>
servlet类(servlet必须集成HttpServlet)
package servlet;
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 UserServlet extends HttpServlet {
public UserServlet() {
super();
}
public void destroy() {
super.destroy();
System.out.println("destory方法执行");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doGet方法执行");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doPost方法执行");
}
public void init() throws ServletException {
System.out.println("init方法执行");
}
}
可以通过访问jsp来调用servlet(如果form中的method="get",会执行servlet的doGet方法method="post",执行doPost方法,缺省执行doGet),也可以直接访问servlet,在浏览器
地址栏中键入web.xml中URL-pattern中的地址即可访问(URL-pattern的“/”不能省略),否则会出现404错误。需要注意的是:通过浏览器直接访问servlet的情况下,调用的是
servlet的doGet方法,如果只有doPost方法这种访问方式会报错。HTTP Status 405 - HTTP method GET is not supported by this URL。使用上面的配置servlet仅仅能处理一
个jsp,另外还可以使用通配符的方式,一个servlet可以处理多个jsp页面的请求.例如jsp中的action="user.log",web.xml中URL-pattern改为*.log(使用通配符方式的时候前面
的"/"可以省略)。如此一来,所有action="xx.log"的jsp页面的请求都会交给这个servlet来处理。
后续的补充:
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* response.setContentType("text/html;GBK");设置响应的类型为html,字符编码为GBK,
* request.setCharacterEncoding("GBK");请求到达服务器,字符编码会转换为ISO-8859-1,
* 要获得原来的字符编码,需要用上述语句设置。奇怪的是:只要有request.setCharacterEncoding("GBK");
* 那么控制台打印语句中文就不会乱码(从request中获取),但是与response.setContentType("text/html;GBK");一块使用
* 时pw.print();(使用response对象对客户端浏览器做响应)中文会乱码,控制台打印语句不会乱码。但是与response.setContentType("text/html");
* response.setCharacterEncoding("GBK");一块使用,都不会乱码。需要注意,即使是分开写,也要在获取到输出流之前设置
* 响应格式,否则依然会出现乱码问题。
*/
// response.setContentType("text/html;GBK");
request.setCharacterEncoding("GBK");//设置字符编码,从request中获取的中文就不会乱码
String loginname = request.getParameter("loginname");
String password = request.getParameter("password");
System.out.println(loginname);
response.setContentType("text/html");
response.setCharacterEncoding("GBK");//设置响应的字符编码,输出到客户端浏览器的中文不会乱码
PrintWriter pw = response.getWriter();
// response.setContentType("text/html");
// response.setCharacterEncoding("GBK");
pw.print("loginname:"+loginname);
pw.print("password:"+password);
//输出结果:/bookapp2
System.out.println("ContextPath="+request.getContextPath());
//输出结果:POST
System.out.println("getMethod="+request.getMethod());
//输出结果:/bookapp2/login
System.out.println("getRequestURI="+request.getRequestURI());
//输出结果:http://localhost:8080/bookapp2/login
System.out.println("getRequestURL="+request.getRequestURL());
//拿到前台中传递过来的所有的键值对的键的名字,也就是form表单中name属性的值的一个枚举
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String a = (String)e.nextElement();
System.out.println(a);
}
//往request中存取值
request.setAttribute("a", "b");
request.getAttribute("a");
System.out.println(request.getLocalName());
System.out.println(request.getLocalPort());
System.out.println(request.getRemoteHost());
System.out.println(request.getRemotePort());
}
}
关于servlet:我们只是根据sun提供的标准为tomcat开发了一个按照我们的意愿去处理客户请求的类(sun:你只有按照我的标准,服务器才会认可,你胡乱写一个,服务器会蒙圈的就不听你的了),服务器收到请求的时候会自动初始化一个处理请求的对象(servlet的对象)、调用相应的方法、并且将其销毁。这个类本身是不会做什么的,所有的动作都是服务器按照我们提供的这个类去完成的。