servlet回顾

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的对象)、调用相应的方法、并且将其销毁。这个类本身是不会做什么的,所有的动作都是服务器按照我们提供的这个类去完成的。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值