servlet   是运行在服务器端的三大web组件之一 【web三大组件:Servlet  Filter   Listener】
     是处理客户端请求的 还有表单提交的请求
 
      接收请求:接收前端请求
     处理请求:去数据库查询,获取数据库的数据
     返回结果:
请求与响应的过程:下图
 

如何写简单的servlet

1)自定义一个servlet类实现servlet接口,实现接口就意味着实现接口的方法

public class AServlet implements Servlet{}

2)在web.xml文件中注册自定义的servlet

<!-- servlet标签用于向服务器注册一个servlet -->
<servlet>
<!-- servlet-name是我们使用的,我们使用这个servlet-name对servlet进行配置 -->
<servlet-name>AServlet</servlet-name>
<!-- servlet-class是自定义servlet的全类名,这个全类名是服务器使用,服务器用这个全类名创建一个servlet实例(对象) -->
<servlet-class>com.neuedu.Servlet.AServlet</servlet-class>
</servlet> <!-- servlet-mapping是用于做映射请求的 也就是输入什么地址会到当前servlet下处理-->
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping> //注意:<url-pattern>标签中指定的映射路径不必和<servlet-name>指定的内容保持一致
只有浏览器地址栏中请求的url和<url-pattern>标签中的映射一致的时候,我们自定义的servlet类才会处理这个请求
servlet 有广义、狭义之分:
     广义servlet:实现了Servlet接口的类都是广义的Servlet,自定义的servlet就是广义的
     狭义servlet:指jdk中提供的servlet接口

init方法,在创建对象的时候调用,整个生命周期只被调用一次(因为servlet只创建一个对象)
servlet 生命周期 :由产生到销毁
servlet是由tomcat服务器管理
  1. 构造方法:只会在第一次访问servlet类的时候调用一次,调用一次就说明 servlet是单例的,多线程的!同时也是非线程安全的,也就是说在servlet中尽量不要再service方法中操作全局变量!!
  2. init方法:只会在第一次访问servlet的时候调用一次,对servlet对象进行初始化操作
  3. 调用service方法处理请求:在每次访问这个servlet的时候都调用一次,而且我们的业务逻辑也写在service方法
  4. destroy 销毁:只会在项目卸载的时候调用,也就是服务器关闭,tomcat关闭的时候
处理请求,跳转页面的两种方式

1.转发  --地址不变  只请求一次  不能跨域

request.getRequestDispatcher("要转发到的地址").forward(request,response);//地址栏地址不变

2.重定向  --地址变了  多次请求  可以跨域

response.sendRedirect("要转到的地址");//地址栏地址变了
 
在jsp页面中写
<form action="abc" method="post">
用户名<input type="text" name="userid"><br>
密码<input type="password" name="pwd"><br>
<input type="submit">
</form>
//action method必须有,method为post或者get,使用get会在地址上显示你输入的值
红框内为输入的值   形式是 name=输入值&name=输入值,但是这样会泄露密码,所以表单提交一般用post  不显示信息

四个作用域 ---配合jstl用
  • pageContext --当前页面存放, 只能在当前页面取出
  • request --当前页面存放 ,转发页面取出
  • session --当前会话  失效时间(在淘宝页面15分钟不动的话,再次动需要重新登陆)不能跨浏览器,换另一个浏览器需重新登录
  • aqqlication  --当前服务器中  整个服务器共享 服务器不重启就一直有
     最常用的  request ;application 几乎不用
     优先级:pageContext > request > session > aqqlication  
EL表达式:快速取出作用域中的值 ,所有作用域
pageContext.setAttribute("a", "page");
request.setAttribute("a", "request");
session.setAttribute("a", "session");
application.setAttribute("a", "application"); ${ a }//会将四个a全都取出来,但是根据优先级取出pageContext
${requestScope.a }//将取出request,将requestScope中的request换成session就取出session
ServletConfig  :是一个接口 ,一个ServletConfig对象只代表当前的servlet类的配置信息!
代表:servlet的配置信息 --xml中的<servlet>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.neuedu.Servlet.AServlet</servlet-class>
</servlet>
获取方法:由服务器创建,通过init方法的参数直接传递给我们,我们直接在init方法中使用  
功能:
          getServletName( ) :获取当前servlet-name值
          getInitParam( ) :获取当前的servlet的初始化参数
          getServletConText( ) :获取当前web应用!
ServletConText    
代表:当前web应用,也就是web.xml文件中的信息
获取:通过ServletConfig对象的getServletConText
功能:
          getInitParameter( ):获取整个web应用的初始化参数,代码就是如下
 
xml文件中,在<servlet>外写:
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
String initParameter2 = config.getServletContext().getInitParameter("password");
System.out.println(initParameter2);
String initParameter2 = config.getServletContext().getRealPath(servletName);
System.out.println(initParameter2);
//getrealpath()获取真实路径
- 虚拟路径:http://localhost:8080/day0807-servlet/index.html
- 真实路径:E:\安装软件包\eclipse安装 包\eclipse\working\day0807-servlet\WebContent\index.html
MyGenericServlet
     1.定义一个抽象类实现servlet接口,保留service方法不实现,其余方法都实现!
     2.自定义抽象类子类,在web.xml文件中注册一下这个子类
     3.子类构造器->父类构造器->剩余子类构造器->init方法(如果子类有就调用子类的,没有就调用父类的)
 

HttpServlet

public CServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet请求");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
HttpServletRequest
1.代表:浏览器向服务器发送的请求报文
2.获取:由tomcat服务器创建,然后作为参数传递给我们相对应的doGet或者doPost方法
3.功能:
          getParameter( ):获取请求参数,如登陆的用户名和密码等
          getContextPath( ):获取当前项目路径
          setAttribute( )/getAttribute( ): 本身就是一个域对象
 
request.getRequestDispatcher("1.html").forward(request, response);//通过request跳转到1.html
getAttribute( ):四个域对象都可以使用,被作为传递对象,返回值是Object
getParameter( ):只可以被request使用,用于接收参数【url,form表单中】,返回值是String类型
 
HttpServletResponse
     1.代表:服务器响应给浏览器的响应报文
     2.获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
     3.功能    
response.getWriter().println("<h3>hello world!</h3>");//可以返回给浏览器一个页面或者一个页面片段!
response.sendRedirect("/day0807-servlet/1.html");//服务器返给浏览器地址,浏览器需要再次访问服务器给的地址
 
转发和重定向
 
     1.转发:当浏览器向服务器发送请求的时候,服务器自己不处理,而是调用其它的web资源进行处理!
     
     2.重定向:当浏览器向服务器发送请求的时候,服务器返回给浏览器一个特殊的响应,这个特殊的响应告诉浏览器再向另一个地址发送一个请求!
 
 
发生在浏览器端还是服务器端
浏览器的请求次数
浏览器地址栏是否发生变化
浏览器是否能够感知到
request
服务器端
1
不变化
感知不到
response
浏览器端
2
发生变化
感知到
 
 get:转发---doGet
         重定向----doGet
post:转发---doPost 
          重定向---doGet
编码问题分析
     通信双方在进行通信的时候,实际上是将通信的内容【信息】是按照一定的规则转化为二进制进行通讯的
     而这个一定的规则就是字符的编码:ascii,gb2312,gbk,iso8859-1,utf-8;
 
     在请求到达的时候,另一方就需要解码!
 
     乱码原因
          通信双方的编码方式和解码方式不一致造成的,
     解决办法:
          统一通信双方的编码方式和解码方式,都使用utf-8编码!
 
编码分类:
         请求编码
            浏览器编码---》服务器解码iso8859-1
         响应编码
            服务器编码----》浏览器解码
            服务器端默认使用的是iso8859-1编码,而浏览器默认使用的是gb2312,当然我们也可以在页面中告诉浏览器用什么编码方式!
 
请求编码
    get请求
       -  统一浏览器和服务器端的编码格式为utf-8编码:在server.xml文件的connector标签中指定编码格式为utf-8编码:URIEncoding="utf8" 
    post请求
       -  我们可以在post方法中在第一次获取请求参数之前通过request.setCharacterEncoding("utf-8");来设置解码格式!
 
响应编码
     可以通过response.setContentType("text/html;charset=utf-8");设置服务器和浏览器的编码和解码格式!
 
路径问题:
        ①相对路径和绝对路径
          绝对路径:是以 / 开头的路径
               相对于当前服务器的绝对路径:
               相对于当前web应用的绝对路径:
 
          相对路径:不是以 / 开头的路径
 
        ②常见的路径:
            url-pattern:
            转发的路径:
                > 这两个的绝对路径由服务器解析,相对于项目的根目录
                    http://主机地址:端口号/项目名/
 
            重定向的路径:
            页面中的路径:
                > 这两个路径有浏览器解析,相对于服务器的根目录
                    http://主机地址:端口号/
 
base标签
      base标签里面有一个href属性,这个属性允许我们用使用相对路径的方式使用绝对路径!
      我们再使用相对路径的时候,相对路径会以这个href属性值作为前缀!

Servlet---基础、转发重定向、编码问题解析的更多相关文章

  1. Servlet中转发和重定向的路径问题【转】

    转发和重定向的路径问题 Servlet中有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获 ...

  2. servlet请求转发于重定向

    请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛. 一. 请求的转发 Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部" ...

  3. servlet之转发与重定向的区别

    转发(服务器端跳转):  一次请求 <jsp:forward> request.getRequestDispatcher("new.jsp").forward(requ ...

  4. JSP/Servlet基础语法

    相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...

  5. JSP数据交互(二)和Servlet基础

    01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...

  6. Servlet基础知识总结

    Servlet是JavaWeb应用开发的核心组件.Servlet运行在Servlet容器中(例如最常用的Tomcat),它可以为各种客户请求提供相应服务.Servlet可以轻松完成以下任务: 动态生成 ...

  7. servlet基础讲解

    基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...

  8. Servlet基础知识

    基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...

  9. java web基础 --- URL重定向Filter

    java web基础 --- URL重定向Filter httpRequest.getRequestDispatcher("/helloWorld").forward(httpRe ...

  10. 【Java基础】让编码不再让你困惑

    目录 1. ASCII编码 2. Unicode编码 3. UTF-8编码 4. UTF8.UTF16和UTF32之间的区别 5. GBK.GB2312和GB18030之间的区别 6. Java中的编 ...

随机推荐

  1. JS - 实现简单易用的倒计时 x 天 x 时 x 分 x 秒

    <script> (function () { var tian = document.getElementsByClassName('JS-tian')[0]; var shi = do ...

  2. Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 抽象方法: 声明而未被实现的 ...

  3. Python基础之字符编码

    前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf ...

  4. 【NOIP模拟】Grid(字符串哈希)

    题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即 ...

  5. maven - 引用本地jar,进行jar包移动

    背景: 项目为maven工程,部分jar需要需用项目单独修改的本地jar包. 配置好scope后发现构建后引用的jar没有移动到对应的目录,百度后发现需要配置以下依赖 <plugin> & ...

  6. hash冲突随笔

    一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...

  7. Android studio导出AAR包问题整理。

    最近因为项目需求开始整理一个SDK 以AAR的方式提供出去.在整理的过程中遇到了很多坑. 以下是一些总结希望能帮助遇到同样问题的人. 1.怎么导出AAR,这种文章太多了,我贴一个大家可以做参考. ht ...

  8. 再起航,我的学习笔记之JavaScript设计模式02

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

  9. Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...

  10. PPK提供的浏览器类型及版本检测方法

    PPK提供的浏览器类型及版本检测方法   一个常用但是被高估的Javascript函数就是浏览器检测.有些时候,你想给出一个说明或者加载一个页面来提示用户,以免使用Safari等浏览器. 使用方法: ...