首页 > 基础资料 博客日记
java EE开发之Servlet第一课:servlet的创建方式
2023-08-05 19:01:18基础资料围观223次
本系列课程是在建立在读者有一定的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);
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:JAVA面经-基础部分
下一篇:JAVA学习第五周