一、Servlet规范:
1、Servlet规范来自于JavaEE规范中的一种
2、作用:
1)在Servlet规范中,指定【动态资源文件】开发步骤
2))在Servlet规范中,指定Http服务器调用动态资源文件规则
3)在Servlet规范中,指定Http服务器管理动态资源文件规则
二、Servlet接口实现类:
1、Servlet接口来自于Servlet规范下的一个接口,这个接口存在Http服务器提供的jar包
2、Tomcat服务器下lib文件夹有一个Servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
3、Servlet规范任务中,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
三、Servlet接口实现类开发步骤:
第一步:创建一个Java类继承于HttpServlet类,使之成为Servlet接口实现类
第二步:重写HttpServlet父类两个方法,doGet或doPost
get
浏览器---------->OneServlet.doGet()
post
浏览器---------->OneSevlet.doPost()
第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
【网站】------->【Web】--------->【WEB-INF】----------->web.xml
<!--将Servlet接口实现类类路径地址交给Tomcat-->
<servlet>
<servlet-name>helloWorld</servlet-name> <!--声明一个变量存储Servlet接口实现类类路径-->
<servlet-class>com.example.Servlet.OneSevlet</servlet-class><!--声明Servlet接口实现类路径-->
</servlet>
相当于:Tomcat String helloWorld = "com.example.Servlet.OneSevlet"
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短的请求别名-->
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/one</url-pattern> <!--设置简短请求别名,别名必须以“/”开头-->
</servlet-mapping>
浏览器向Tomcat索要OneServlet时的地址:
四、Servlet对象生命周期:
1、网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建,开发人员不能手动创建Servlet接口实现类的实例对象
2、在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时,自动创建这个Servlet接口实现类的实例对象
在手动配置情况下,可以要求Http服务器在启动时自动创建Servlet接口实现类的实例对象
<servlet>
<servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径-->
<servlet-class>com.HelloWorldServlet</servlet-class> <!--class文件目录-->
<load-on-startup>30</load-on-startup> <!--填写一个大于0的整数,在服务器启动时加载Servlet接口实现类的实例化对象象,数值代表加载的优先级,值越小,优先级越高-->
</servlet>
3、在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
4、在Http服务器关闭时刻,会自动将网站中所有的Servlet对象进行销毁
<servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>com.example.Servlet.OneServlet</servlet-class>
<load-on-startup>8</load-on-startup>
</servlet>
<!--为路径取一个别名-->
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
五、HttpServletResponse接口
1、介绍:
1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2)HttpServletResponse接口实现类由Http服务器负责提供
3)HttpServletResponse接口负责将doget/doPost方法执行结果写入到【响应体】交给浏览器
4)开发人员习惯于将HttpServletResponse接口修饰的对象成为【响应对象】
2、主要功能:
1)将执行结果以二进制形式写入到【响应体】
2)设置响应头中【content-type】属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为
【文字、图片、命令、视频】
3)设置响应头中【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求
public OneServlet() {
System.out.println("OneServlet被实例化");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result="Hello World"; //响应结果
//响应对象将结果写入到响应体
PrintWriter out = resp.getWriter(); //1、通过响应对象,向Tomcat索要输出流
out.write(result); //通过输出流,将执行结果以二进制形式写入到响应体
//doGet执行完毕
//Tomcat将响应包推送给浏览器
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int money = 50; //执行结果
PrintWriter out = resp.getWriter();
// out.write(money);
/*出现的问题:浏览器出现的是2,不是50
*问题原因:
* out.writer方法可以将【字符】、【字符串】、【ASCII码】写入响应体
* */
// out.write(97);
/*
* 问题解决方案:实际开发过程中,都是通过out.print方法将真实数据写入响应体
* */
out.println(money);
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result = "Java<br/>Mysql<br/>HTML<br/>Python<br/>"; //既有文字信息,又有HTML标签命令
String result2 = "奥数神座";
resp.setContentType("text/html;charset=utf-8"); //在得到输出流之前设置响应头的content-type
PrintWriter out = resp.getWriter();
out.println(result);
out.println(result2);
/*
* 问题描述:Java<br/>Mysq<br/>lHTML
* 浏览器在接收到响应结果时,将<br/>
* 作为文字内容在窗口展示出来,没有将
* <br/>当作HTML标签命令来执行
*
* 问题原因:浏览器收到响应包之后,根据响应头中【content-type】
* 属性的值,来采用对应【编译器】对响应体中【二进制内容
* 进行】编译处理
*
* 在默认情况下,content-type属性的值为"text",content-type="text"
* 此时,浏览器将采用【文本编译器】对响应体二进制数据进行解析
*
* 解决方案:一定要在得到输出流之前,通过响应对象对响应头中content-type属性
* 进行重新赋值,指定浏览器采用正确编译器
* */
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result = "http://www.baidu.com";
//通过响应对象,将地址赋值给响应头中【location】属性
resp.sendRedirect(result);
/*
* 浏览器在接收到响应包之后,如果
* 发现响应头存在location属性,
* 会自动通过地址栏向location指定网站发送请求
*
*sendRedirect方法远程控制浏览器请求行为【请求地址,请求方式,请求参数】
* */
}