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);
- java EE开发之Servlet第一课
- java EE开发之Servlet第三课:过滤器(Filter)
- java EE开发之Servlet第四课:监听器(Listener)
- java EE开发之Servlet第五课:xml解析
- java EE开发之Servlet第六课:神奇的Ajax
- java EE开发之Servlet第七课:JNDI
- java EE开发之Servlet第十一课:反射基础三
- java EE开发之Servlet第十四课:自定义注解Annotation
- java ee 之 servlet
- java EE开发之Servlet第二课:Servlet的三个hashMap
- Java EE之Servlet技术
- Java EE之Servlet技术
- java EE开发之Servlet第十二课:简单自定标签
- java EE开发之Servlet第十三课:复杂自定标签
- Java EE之Servlet、JSP学习
- Java EE — Servlet 01 Servlet 开发流程
- JAVA EE Servlet监听器
- Java EE Servlet监听器
- kali 扫描篇
- LinkedList源码探险记
- LeetCode199—Binary Tree Right Side View
- NYOJ477 - A+B Problem III
- 9.3.4
- java EE开发之Servlet第一课
- C语言常用的一些(慢慢补充)
- Fragment在生命周期中是如何走到onCreateView的(二)
- NYOJ243 - 交换输出
- work bench 建表时PK/NN/ UQ等的含义
- bash扩展
- Note7燃损原因真相大白三星加强安全检查保障未来产品安全
- java学习资料免费下载(持续更新ing)
- CSS3 循环跳跃起伏的竖线(类似于语音助手动画)