1. Servlet进行动态网页开发
1.1. 用于开发动态的网页
书写流程:
- 写一个class类,去继承一个Httpservlet
- 重写service方法,注意一定要super.service()
- 进行动态网页的开发
- 在web.xml中配置
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Servlet01</servlet-name>
<servlet-class>com.wyb.servlet.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet01</servlet-name>
<url-pattern>/servlet/Servlet01</url-pattern>
</servlet-mapping>
</web-app>
注意:servlet-name是自己任意命名的,url-pattern也是的
- 在网页中访问即可输入自己定义的url-pattern即可
1.2. 使用Servlet进行流程控制
- 进行流程的控制(重要的作用)
java
public class DoLogin extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 接收login.jsp页面发送过来的数据
String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");
// 2. 数据处理,得到结果--使用接收的数据去数据库做比较
boolean flag = false;
if("wyb".equals(uname) && "123".equals(pwd)) {
flag = true;
}
// 3. 根据返回的结果给用户作出响应
if(flag) {
// 可以实现页面的跳转-转发
request.getRequestDispatcher("admin/success.jsp").forward(request, response);
} else {
request.getRequestDispatcher("admin/login.jsp").forward(request, response);
}
}
}
总结:
- Servlet是一个基于Java技术的动态网页技术,运行在服务器端,由Servlet容器管理,用于生成动态的内容,是JSP的前身,编写一个Servlet,实际上就是按照Servlet规范编写一个java类
- Servlet是由Tomcat管理,没有main()方法
- JSP的本质是一个Servlet
- JSP执行过程:.jsp--翻译--.java(Servlet)--编译--.class--执行
2. Servlet生命周期
2.1. 生命周期
Servlet是一个单实例,多线程的程序
- 类加载:
Class clazz = Class.forName("com.wyb.servlet");
- 实例化(离不开反射):
Object obj = clazz.newInstance();
- 初始化(离不开反射)
- 服务请求(service)(离不开反射)
- 销毁操作(离不开反射)
2.2. 类加载时机
- 默认第一次访问Servlet进行类加载
<load-on-startup>0</load-on-startup>
(当启动服务器时加载)数字越小加载时机越往前
java
public class Servlet01 extends HttpServlet {
// 实例化方法,只执行一次
public Servlet01() {
System.out.println("Servlet01");
}
// 请求服务-每一次请求都会执行
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
System.out.println("Servlet01 doGet");
}
// 请求服务-每一个请求都会执行
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("Servlet01 doPost");
}
// 判断调用doGet还是doPost,执行多次
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
// 获得传递的方法名称-GET/POST
String method = request.getMethod();
System.out.println(method);
if("GET".equals(method)) {
doGet(request, response);
}else if("POST".equals(method)) {
doPost(request, response);
}else {
System.out.println("执行其他方法");
}
}
// 销毁操作,关闭服务器执行一次
@Override
public void destroy() {
System.out.println("Servlet01 destroy");
}
// 初始化方法-执行一次
@Override
public void init() {
System.out.println("Servlet01 init");
}
}
3. Servlet API
3.1. 书写Servlet的方式
- Servlet必须直接或间接实现javax.servlet.Servlet接口
- 通过继承javax.servlet.GenericServlet类实现跨协议的Servlet
- 通过继承javax.servlet.HttpServlet实现HTTP Servlet
- 自己定义Servlet,其他的java类都继承此Servlet
3.2. 接口和类
- Servlet接口:所有的Servlet直接或间接实现的类
init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destory()
getServletInfo():
获得Servlet信息getServletConfig():
获得Servlet相关配置信息
- GenericServlet抽象类:
implements Servlet, ServletConfig
- 定义了一个通用的,不依赖于具体协议的Servlet,给出了除service()方法的其余四个方法的实现
public void init(ServletConfig config) throws SerletException; protected void init() throws SerletException
第一个是Servlet接口的init(),调用第二个init(),重写第二个init()接口
- HttpServlet类
public void service(ServletRequest req, ServletResponse res)
protected void service(HttpServletRequest req, HttpServletResponse res)
protected void doGet(req, res)
protected void doPost(req, res)
- public service()是父类的方法,protected service()是自己的方法。根据HTTP请求方法的类型调用相应的doXxx()方法
- 自己编写的Servlet应该继承HttpServlet,一般要覆盖Service或doPost/doGet方法
4. 参数读取
- 配置参数读取的意义:把参数提取到配置的信息中,大大增加了代码的实用性,方便维护
java
public class ParamServlet extends HttpServlet {
String enc;
String encc;
String enc2;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("初始化参数:" + enc);
System.out.println(encc);
System.out.println("上下文参数:" + enc2);
}
@Override
public void init() {
// 获得初始化参数
enc = this.getInitParameter("enc");
encc = this.getServletConfig().getInitParameter("enc");
// 获取上下文参数,this.getServletContext(): 获得全局的对象
enc2 = this.getServletContext().getInitParameter("enc2");
System.out.println("读取初始化参数完毕");
}
}
4. 中文乱码处理
- post方式:
request.setCharacterEncoding("utf-8")
- get方式:
byte[] bytes = str.getBytes("iso-8859-1"); String cstr = new String(bytes, "utf-8");
- 在server.xml中指定对应的服务器编码:
URIEncoding = "utf-8"