servlet的概念及运行流程

使用:
    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接收后,无法进行处理,建议使用重定向定位到可以处理的资源

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值