java EE开发之Servlet第一课:servlet的创建方式

本系列课程是在建立在读者有一定的java Web基础技术的基础上,如果没有基础,那么看起来会很吃力。

##1,回顾

tomcat就是一个web应用服务器,那可以这样说服务总公司,它可以向外界提供服务,但是它本身像一个超级服务场所,允许别人在它指定的地方开门店,但是门店必须在指定的位置,按照它的统一标准开店,由总公司统一管理。那我们建立的一个web项目相当于就是一个门店,然后布属到webapps下。开了店子弄些服务员,写的jsp就是服务员,但是jsp必须编译成java代码才能运行,那么这个Java文件就是一个servlet,那么servlet是另外一种服务员

  • JSP和SERVLET到底什么区别呢?

JSP就象宾馆前台的服务员,要长的不错,让顾客一看就觉得比较舒服,他主要就是负责显示这个宾馆的形象的.而SERVLET就象部门经理,要处理各种各样的业务和事情
那我们怎样才能写一个servlet呢,sun公司定义一套实现servlet标准(接口),只要实现了这个接口,就拥有了自己的一个servlet类,那么类是不会提供服务的,只有这个类的一个对象才能向外界提供服务,那谁来new出这个对像呢 ,由服务总公司new出来,然后给你的门店里使用

##2.怎样实现servlet

##方式一:实现servlet接口

###A.接口中方法的解释

###1)服务的方法

向外界提供服务的方法,每请求一次,就向外界提供服务一次,但是要注意下面的例子,i是会递增的,那证明无论请求多少次此servlet都只有一个对象,所以足以证明servlet 是单例模式

ServletRequest接口的实现类对象封装了从客户端向服务端发送的请求信息ServletResponse接口的实现类对象封装了从服务端向客户端响应的信息

int i=0;
public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException {
		System.out.println("服务了一次"+i+"次");
}

写好了service就可以让服务员挂牌服务了

  • 怎么挂牌:这里是打了比方等价于servlet的配置
    servlet需要配置的目的是为了让客户端能够访问到该Servlet(服务员)
<servlet>
       <servlet-name>hello</servlet-name>
       <servlet-class>com.accp.servlet.Hello</servlet-class>
 </servlet>
 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>  //注意“/”不能少
 </servlet-mapping>
  • 怎么访问呢

浏览器中输入:

http://localhost:端口号//项目名/url-pattern配值的参数值

可以看到我们已经访问到了我们刚刚通过实现接口的方式的写的Servlet,并且成功的调用了service方法

###**2)初始化方法 **

ServletConfig 记录当前这个服务员的信息(比如芳龄多少啊,哪里人士等等)ServletConfig其实就是记录了servlet的配置信息

**注意:**在servlet被tomcat new出来的时候,就自动创建了ServletConfig这个对象然后tomcat会到new好的ServletConfig扔到方法内,供方法使用

一般使用的方式:
(设置一个全局的ServletConfig,这样其他的方法就可以使用到这个ServletConfig )

private  ServletConfig config;
public void init(ServletConfig config) throws ServletException {
	//在这里进行设置(重要
	this.config =config;
	System.out.println("开始学习了");
	//拿到sevlet名字
	System.out.println("Servlet名字:"+config.
						    getServletName());	
}

###**3)销毁的方法 **

当sertvlet被销毁的时候tomcat调用此方法,servlet在服务器重启或关掉的时候被销毁

public void destroy() {
		System.out.println("销毁了");
}

###4)获取config对象的方法

返回servlet的配置信息对象

public ServletConfig getServletConfig() {
	return config;
}

###5)获取servlet说明信息的方法
返回servlet的说明信息

public String getServletInfo() {
	return "这是我写的servlet";
}

相当于:

<%@ page info="这是我写的jsp"%>
<%  out.println(this.getServletInfo())  %>

###B.使用ServletResponse 向客户端打印输出信息
设置响应的编码

第一种方式:
res.setContentType(“text/html;charset=GB18030”);
与<%@ page contentType=“text/html; charset=GB18030”%>相对应
第二种方式:
使用配置文件和SevletConfig的配合(更具通用性,很多servlet可以同时使用)
配置文件

<init-param>
    <param-name>encoding</param-name>
    <param-value>text/html;charset=GB18030</param-value>
</init-param>

SevletConfig对象得到初始化参数

String encoding = config.getInitParameter("encoding");
res.setContentType(encoding);
PrintWriter out = response.getWriter();
out.println("Hello! I am servlet!");//输出英文
out.println("你好,我是servlet");//输出中文

###C.使用ServletRequest对象拿到客户端信息
建立一个jsp,写一个表单,用户登录提交,注意action=“url-pattern中的参数”(不要/),然后提交到一个与url-pattern对应的servlet,然后在servlet的service方法中就可以获 取值
**注意:**中文乱码问题(post)

//解决post方式提交的中文乱码
req.setCharacterEncoding("GB18030"); 

使用超链接也可以

<a href="hello?uname=uu&pwd=uu">登录</a>

##方式二:继承GenericServlet

重写service方法(必须的)
GenericServlet是一个抽象类实现了Servlet接口,增加了一个ServletConfig的引用

private ServletConfig config;
public void init() throws ServletException {}//新增的
public void init(ServletConfig config) throws ServletException {
	  this.config = config;
	  this.init();//调用新增的
}

这样就做就没有以前那么麻烦,所以如果以后要重写初始化方法,重写新增的,如果要重写原来的有参的init(),要记得在方法里写上这句super.init(config),这是关键;

写一个例子:根据提交的方式输出信息
HttpServletRequest实现了ServletRequest接口
注意:请求是基于http协议的,所以可以强制转换

HttpServletRequest request = (HttpServletRequest)req;
	PrintWriter out = res.getWriter();
	String method = request.getMethod();
	if(method.equalsIgnoreCase("post")){	
		out.println("hello,post");
	}else{
		out.println("hello,get");
	}
  

这种方式过于麻烦于是可以采取第三种方式解决
##方式三:继承HttpServlet
专门针对于http协议的
HttpServlet继承了GenericServlet,重写了service方法
注意: service方法中

if (method.equals(METHOD_GET)) {
	doGet();
}else if(method.equals(METHOD_POST)){
	doGet();
}

所以我们继承HttpServlet只需要实现doGet()和doPost()
**原理是:**先看自己类里面有没有service方法,子类没有就调用父类的service方法,然后根据请求方式,再调用子类重写的doGet()和doPost() (多态)
如果同时又重写了service(),出现doGet()和doPost() 失效,是因为自己类的service()里面并没有去调用doGet()和doPost(),所以要注意在重写service(),记得在方法体内加入 super.service(req, resp);,重新调回父类的

不推荐重新service(),除非万不得已,需要在service()处理数据,记得在方法体内加入super.service(req, resp);


超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:

腾讯课堂测试技术学习地址

发布了26 篇原创文章 · 获赞 13 · 访问量 7034

猜你喜欢

转载自blog.csdn.net/womeia331416/article/details/54730756