使用:
1、创建普通的java类并继承HttpServlet
2、覆写service方法
3、在service方法中书写逻辑代码即可
4、在webRoot下的WEB-INF文件夹下的web.xml文件配置servlet
url组成:
服务器地址:端口号/虚拟项目名(webapps下的文件夹名称)/servlet的别名(要执行的servlet的url-pattern)
URI:虚拟项目名(webapps下的文件夹名称)/servlet的别名(要执行的servlet的url-pattern)
Servlet的生命周期
1、从第一次调用到服务器关闭。
2、如果Servlet在web.xml中配置了load-on-startup则生命周期为从服务器启动到服务器关闭
注意:
init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
destory方法是在Servlet被销毁时执行的,也就是服务器关闭时
代码示例
ServletLife.java
--------------------------------------------------------------------------------
package com.zky.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletLife extends HttpServlet {
//初始化方法,在servlet第一次加载内容时候的方法
@Override
public void init() throws ServletException {
System.out.println("servlet初始化完成");
}
//servlet方法,真正处理请求的方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("ServletLeft");
System.out.println("ServletLeft");
}
//
@Override
public void destroy() {
System.out.println("我被销毁啦");
}
}
--------------------------------------------------------------------------------
web.xml
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>03-MyServlet</display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ServletLife</servlet-name>
<servlet-class>com.zky.servlet.ServletLife</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletLife</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
--------------------------------------------------------------------------------
Service方法和doGet方法和doPost的区别
service方法:
可以处理get/post方式对的请求,如果servlet中有service方法,会优先调用service方法对请求进行处理
doGet方法:
处理get方式的请求
doPost方法:
处理post方式的请求
注意:
如果在覆写的service的方法中调用了父类的service方法(super.service(agr0,arg1)),则service方法处理后,会再次根据请求方式响应doGet()和doPost()方法执行。所以,一般情况下
我们是不在覆写的service中调用父类的service方法的,避免出现405错误。
Servlet常见错误:
404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误
原因而:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:
java.lang.ClassNotFoundException:com.bjsxt.servlet.ServletMothed
解决:
在web.xml中校验servlet类的全限路径是否拼写错误。
错误二:
因为service方法体中的代码错误导致
解决:
根据错误提示对service方法中的代码进行错误更改。
405错误:请求方式不支持
原因:
请求方式和servlet中的方法不匹配所造成的
解决:
尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service方法。
request对象学习:
作用:request对象中封存了当前请求的所有请求信息
使用:
获取请求头数据
//获取请求方式
String method=req.getMethod();
//获取请求URL
StringBuffer url=req.getRequestURL();
//获取URI
String uri=req.getRrquestURI();
//获取协议
String h=req.getScheme();
获取请求行数据
//获取指定的请求行信息
String value=req.getHeader("host(键名)");//不存在时会返回null
//获取所有的请求行的键的枚举
Enumeration e=req.getHeaderNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
String value2=req.getHeader(name);
System.out.println(name+":"+value2);
}
//获取用户数据
String name=req.getParameter("uname(键名)");//不能获取多选框的 不存在时会返回null
//获取多选框的 返回数组
String[] favs=req.getParameterValues("fav(键名)");
if(favs!=null){
for(String fav:favs){
System.out.println(fav);
}
}
//获取所有的用户请求数据的键的枚举集合
req.getParaterNames()//用法同req.getHeaderNames()一样
注意:
如果要获取的请求数据不存在,不会报错,返回null,可能会造成空指针异常错误。
注意:
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法response对象学习
使用:
设置响应头
setHeader(String name,String value);//在响应头中添加相应的信息,但是同键会覆盖
addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖
设置响应编码格式
resp.setHeader("ontent-type","text/html;charset=utf-8");
设置响应状态码
resp.sendError(404,"this Method is not suported");
等价于
reap.setContentType("text/html;charset=utf-8");//发送给浏览器的是html文本
reap.setContentType("text/plain;charset=utf-8");//发送给浏览器的是普通文本
reap.setContentType("text/xml;charset=utf-8");//发送给浏览器的是xml文本
设置响应实体
resp.getWriter().write("<b>今天天气真好,适合学习</b>");//响应具体的数据给浏览器
总结:
service请求处理代码流程
设置响应编码格式
获取请求数据、
处理请求数据
数据库操作(MVC思想)
响应处理结果
请求中文乱码解决
从浏览器端获取用户输入的数据,如果用户输入中文时可能会造成乱码,因为浏览器端的编码格式为iso8859-1,而服务器端的编码格式为utf-8,
1、拿到用户输入的中文数据要用String方法转换一下。
具体操作步骤如下
String uname=req.getParament("uname");
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
2、Get方式请求:
步骤一:在service方法中使用:req.setCharacterEncoding("utf-8");
步骤二:在tomcat服务器中目录下的conf文件下找到server.xml文件,打开进行如下配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI="true"/>
3、Post方式请求
在service方法中使用:req.setCharacterEncoding("utf-8");
Servlet流程总结:(重点)
浏览器发起请求到服务器(请求)
服务器接受浏览器的请求,进行解析创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法进行请求处理
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息
//创建业务层对象
//调用业务层对象方法
//响应处理结果
数据流转流程:
浏览器----->服务器----->数据库
浏览器<-----服务器<-----数据库
请求转发学习:
作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
使用:
req.getRequestDispatcher("要转发的地址").forward(req, resp);
地址:相对路径,直接书写servlet的别名即可
特点:
一次请求,浏览器地址栏信息不变
注意:
请求转发后直接return结束即可
request对象的作用域
问题:
使用请求转发后,不同的Servlet之间怎么进行数据的共享呢?或者说数据怎么从一个servlet流转给另外一个Servlet呢?
解决:
使用request对象的作用域
使用:
request.setAttribute(Object name,Object value);
request.getAttribute(Object obj);
作用:
解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题
作用域:
基于请求转发,一次请求中的所用Servlet共享
注意:
使用request对象进行数据流转,数据只在一次请求类有效
特点:
服务器创建
每次请求都会创建
生命周期一次请求
重定向:
问题:
如果当前的请求,Servlet无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?
解决:
使用重定向
使用:
response.senRedirect("路径")
本地路径为:URI
网络路径为:定向资源的URL信息
示例:
resp.sendRedirect("/login/main");
特点:
两次请求,两个request对象
浏览器地址栏信息改变
时机:
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源