java EE开发之Servlet第一课

来源:互联网 发布:tomcat连不上数据库 编辑:程序博客网 时间:2024/06/05 15:43

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

一,回顾

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

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

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

二.怎样实现servlet

1,实现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>

2,继承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");    }

这种方式过于麻烦于是可以采取第三种方式解决

3,继承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);

1 0
原创粉丝点击