servlet类

servlet
  • servlet接口及实现具体类
  • 解决了浏览器请求java程序中.class接收响应问题
  • 一旦有一个类可以接受浏览器请求,java对象就可以调用dao对象访问数据库
  • 代替了serive使用网络套接字和外界进行数据通信。
servlet使用
  • 操作步骤
    • 搭建Web开发环境
    • 创建动态Web工程
    • 创建javax.servlet.Servlet接口的实现类:com.atguigu.servlet.MyFirstServlet
    • 在service(ServletRequest, ServletResponse)方法中编写如下代码,输出响应信息:
    • 在web.xml配置文件中注册MyFirstServlet
    • 由服务器提供servlet的实现。
@Override
public void service(ServletRequest req, ServletResponse res)
		throws ServletException, IOException {
	//1.编写输出语句,证明当前方法被调用
	System.out.println("Servlet worked...");
	//2.通过PrintWriter对象向浏览器端发送响应信息
	PrintWriter writer = res.getWriter();
	writer.write("Servlet response");
	writer.close();
}

//xml配置如下:
<!-- 声明一个Servlet -->
<servlet>
	<!-- 为Servlet指定一个名称,以便于引用 -->
	<servlet-name>MyFirstServlet</servlet-name>
	<!-- 注册Servlet实现类的全类名 -->
	<servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
</servlet>

<!-- 建立一个从虚拟路径到Servlet之间的映射关系 -->
<servlet-mapping>
	<!-- 引用Servlet名称 -->
	<servlet-name>MyFirstServlet</servlet-name>
	<!-- 映射到Servlet的虚拟路径:“/MyFirstServlet” -->
	<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>

servlet访问机制
  • 标签中设置java servlet的url地址,
  • 并由标签中设置java servlet类的权限定名映射。
  • 访问设置的目录即可和web页面一样访问,支持a标签等跳转。
servlet生命周期,从创建到销毁
  • 构造器,浏览器请求访问本servlet时创建,首次访问执行
  • init() 初始化参数,创建止之后初始化,首次访问执行
  • service() 执行,接受请求,服务器提供参数列表,每次访问执行一次
  • destroy() 销毁,关闭web容器(服务器tomcat)时销毁,因为服务器不确定是否还会再使用
servletConfig和ServletContext
  • servletConfig
    • 定义:servletConfig相当于servlet配置信息
    • 作用:
      1. 获取当前Servlet名字:get…
      2. 获取当前servlet初始化参数:get…
      3. 获取SerletContext对象
  • ServletContext
    • 定义:相当于当前的web项目
    • 作用:
      1. 当前web下的初始化参数
      2. 获取当前web的真实路径:上传下载
      3. 域对象
servlet类实际创建方式
  • extends HttpServlet类
  • extends GenericServlet类
  • GenericServlet类实现了servlet类,把servletConfig提升成属性或内置对象,并部分对原始方法做实现
  • HttpServlet类继承了GenericServlet类,把servletConfig实现并拆分成doget和dopost方法,实现了所有的方法但没处理所以方法大多为空,等待子类继承实现,一般重写的为doget和doset方法
  • 新建的servlet类继承HttpServlet类只需重写doget和doset方法,即可把响应的操作注入servlet中,这种模式类似于thread类中重写run方法。
请求响应参数
  • request
    • 类型:HttpServletRequest requets
    • 定义:相当于浏览器向服务器中发送的请求报文,客户端在第一次请求servlet时,创建,同时以参数的形式传递都get()和dopost().
    • 作用
      1. 获取客户端的请求参数
      2. 获取当前项目的虚拟路径
      3. 转发…获取转发对象->转发
      4. 域对象
    • 方法
      1. getParameter(String args);
      2. getContextPath();
      3. getRequestDispatcher(String url);
  • response
    • 类型:HttpServletResponse
    • 定义:相当于服务器向浏览器发送的响应报文,客户端在第一次请求servlet时,创建,同时以参数的方式传递到doget()和dopost().
    • 作用:
      1. 向客户端响应页面或文本
      2. 重定向
    • 方法
      1. sendRedirect(String url);
转发重定向的区别
  • 客户端路径
    • 转服路径不改变
    • 重定向路径改变
  • 转发可以访问WEB-INF下的资源,重定向不能访问
  • 转发是服务器发送的,只发送一次请求,重定向是浏览器发送的,发送两次
  • 转发可以request域中的资源,重定向不能共享
路径问题
  • 相对路径和绝对路径以及转发重定向处理方式不同而导致的问题
  • 相对路径
    • 相对于当前路径下跳转访问文件/文件,可以直接访问同级目录,可以通过层级的方式访问同级目录下的子级目录,,或者…/方式访问父级目录,使用“/”分割目录名或文件名
  • 绝对路径问题
    • “/”开头代表着项目绝对路径
      1. 浏览器解析,基于服务器路径:localhost:8080;
      2. 服务器解析,基于当前项目路径:localhost:8080:name;
    • 解析分类
      • html页面中的路径由浏览器解析
      • 重定向由浏览器解析
      • 转发由服务器解析
      • url-pattern标签由服务器解析
  • 处理方式,全部项目使用绝对路径,只区分是由浏览器解析还是使用服务器解析
  • base标签的href属性可以设置下面的标签的相对路径都基于href设置的路径
  • 动态根路径:
    • <base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
乱码问题
  • 编码:将字符转成二进制过程
  • 解码:将二进制转成字符的过程
  • 乱码:编码和解码字符集不一致,出现乱码
    1. 浏览器->服务器:请求乱码
    2. 服务器->浏览器:响应乱码
  • 默认情况
    1. 服务器默认编码解码方式一致:ISO-8859-1
    2. 浏览器编码默认为:
      • 解码默认为:GBK
  • 处理方式
    • 请求乱码:
      1. post请求,request.setCharacterEncoding(String env)。
      2. get请求,
        1. 使用String构造器
        2. server.xml里面改变自字符集,设置端口的标签属性添加:URIEncodeing=“utf-8”
        3. 默认get请求,例如a, form
    • 响应乱码
      1. //response.setCharacterEncodeing(“utf-8”)…验证不可行
      2. response.setContentType("text/html;charset=utf-8)…响应头添加解码方式
      3. response.setCharacterEncodeing(“GBK”)…验证通过
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值