首页 > 基础资料 博客日记

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

2023-08-05 19:01:18基础资料围观223

Java资料网推荐java EE开发之Servlet第一课:servlet的创建方式这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

 

 

本系列课程是在建立在读者有一定的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接口的实现类对象封装了从服务端向客户端响应的信息

 

1 int i=0;

2 public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException {

3 System.out.println("服务了一次"+i+"次");

4 }

 

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

 

  • 怎么挂牌:这里是打了比方等价于servlet的配置

 

servlet需要配置的目的是为了让客户端能够访问到该Servlet(服务员)

 

1 <servlet>

2        <servlet-name>hello</servlet-name>

3        <servlet-class>com.accp.servlet.Hello</servlet-class>

4 </servlet>

5 <servlet-mapping>

6         <servlet-name>hello</servlet-name>

7         <url-pattern>/hello</url-pattern>  //注意“/”不能少

8 </servlet-mapping>

 

 

  • 怎么访问呢

 

浏览器中输入:

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

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

 

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

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

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

 

一般使用的方式:

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

 

1 private  ServletConfig config;

2 public void init(ServletConfig config) throws ServletException {

3 //在这里进行设置(重要

4 this.config =config;

5 System.out.println("开始学习了");

6 //拿到sevlet名字

7 System.out.println("Servlet名字:"+config.

8    getServletName()); 

9 }

 

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

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

 

1 public void destroy() {

2 System.out.println("销毁了");

3 }

 

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

返回servlet的配置信息对象

 

1 public ServletConfig getServletConfig() {

2 return config;

3 }

 

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

返回servlet的说明信息

 

1 public String getServletInfo() {

2 return "这是我写的servlet";

3 }

相当于:

1 <%@ page info="这是我写的jsp"%>

2 <%  out.println(this.getServletInfo())  %>

3

 

###B.使用ServletResponse 向客户端打印输出信息

设置响应的编码

 

    第一种方式:

    res.setContentType(“text/html;charset=GB18030”);

    与<%@ page contentType=“text/html; charset=GB18030”%>相对应

    第二种方式:

    使用配置文件和SevletConfig的配合(更具通用性,很多servlet可以同时使用)

    配置文件

 

1 <init-param>

2     <param-name>encoding</param-name>

3     <param-value>text/html;charset=GB18030</param-value>

4 </init-param>

 

SevletConfig对象得到初始化参数

 

1 String encoding = config.getInitParameter("encoding");

2 res.setContentType(encoding);

3 PrintWriter out = response.getWriter();

4 out.println("Hello! I am servlet!");//输出英文

5 out.println("你好,我是servlet");//输出中文

 

###C.使用ServletRequest对象拿到客户端信息

建立一个jsp,写一个表单,用户登录提交,注意action=“url-pattern中的参数”(不要/),然后提交到一个与url-pattern对应的servlet,然后在servlet的service方法中就可以获 取值

**注意:**中文乱码问题(post)

 

1 //解决post方式提交的中文乱码

2 req.setCharacterEncoding("GB18030"); 

使用超链接也可以

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

##方式二:继承GenericServlet

重写service方法(必须的)

GenericServlet是一个抽象类实现了Servlet接口,增加了一个ServletConfig的引用

 

1 private ServletConfig config;

2 public void init() throws ServletException {}//新增的

3 public void init(ServletConfig config) throws ServletException {

4   this.config = config;

5   this.init();//调用新增的

6 }

 

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

 

写一个例子:根据提交的方式输出信息

HttpServletRequest实现了ServletRequest接口

注意:请求是基于http协议的,所以可以强制转换

 

1 HttpServletRequest request = (HttpServletRequest)req;

2 PrintWriter out = res.getWriter();

3 String method = request.getMethod();

4 if(method.equalsIgnoreCase("post")){ 

5 out.println("hello,post");

6 }else{

7 out.println("hello,get");

8 }

9

 

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

##方式三:继承HttpServlet

专门针对于http协议的

HttpServlet继承了GenericServlet,重写了service方法

注意 service方法中

 

1 if (method.equals(METHOD_GET)) {

2 doGet();

3 }else if(method.equals(METHOD_POST)){

4 doGet();

5 }

 

所以我们继承HttpServlet只需要实现doGet()和doPost()

**原理是:**先看自己类里面有没有service方法,子类没有就调用父类的service方法,然后根据请求方式,再调用子类重写的doGet()和doPost() (多态)

如果同时又重写了service(),出现doGet()和doPost() 失效,是因为自己类的service()里面并没有去调用doGet()和doPost(),所以要注意在重写service(),记得在方法体内加入 super.service(req, resp);,重新调回父类的

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

 


文章来源:https://www.cnblogs.com/xmxit/p/16529085.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云