Servlet

服务器


 

1.管理互联网资源(HTML 图片  视频  数据)

2.被动等待用户的请求request(方法)

3.将用户请求的内容,返回(响应  response)给客户端(用户)

URL(统一资源定位符)

url:http://ip:port/项目名/资源路径

rui:/项目名/资源路径   本tomcat内部资源路径

  应用:form   a  link  img

url-pattern:/资源路径    本项目内部资源

 

servlet


 

概念一段Java程序,可以运行在tomcat端

语法Servlet标准(接口)JavaEE标准(servlet-api.jar)

1.接口
    interface Servlet{
        inint(){servlet对象创建的自动调用}
        destroy(){servlet对象销毁的自动调用}
        // 用户访问tomcat服务器的该程序,调用service方法
        service(){
            //用户请求后,执行的代码
        }

2.JavaEE提供类:  HttpServlet   实现了Servlet接口

3.自定义tomcat运行代码
    public class MyServlet extends HttpServlet{
        public void service(){
            //覆盖servlet的service方法
        }
    }

 

核心:

 WEB-INF\classes  :编译后的servlet的class文件(带包)

web.xml

  • 管理servlet程序,注册servlet程序servlet的名字  ----servlet类全类名
  • 映射servlet被访问的路径---servlet名字  访问路径  
  • <servlet>
          <servlet-name>firstServlet</servlet-name>
          <servlet-class>com.lhl.demo1.FirstServlet</servlet-class>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>firstServlet</servlet-name>
          <url-pattern>/firstDate</url-pattern>

 

 异常

1.405 

Method Not Allowed

原因:方法调用错误

解决:1.方法名是否错误  2.service方法内,不能调用父类方法

2.访问servlet变成下载

原因:响应类型设置有问题

resp.setContentType("text/html;charset=UTF-8");

3.servlet修改后,没有变化

原因:servlet代码修改,tomcat需要重启

4.500错误

1.classNotFundException:web.xml的servlet的全类名写错

2.服务端java代码运行异常

5.404错误

原因:浏览器访问地址   不存在    地址写错(浏览器地址栏,url-pattern不一致)   tomcat启动失败

 

 servlet生命周期


 

概念:servlet创建时机和活跃使用时机、销毁时机

interface Servlet{
    //对象创建执行
    init(){}
    
    //浏览器请求到servlet,提供服务的运行方法
    service(){}

    //对象销毁执行
    destroy(){}

 

  • 1.servlet创建

    第一个浏览器访问servlet,对象会被创建

    一个Servlet类只会创建一个servlet对象,且提供所有用户访问

    • 第一次访问创建
    • tomcat启动创建     <load-on-startup>1</load-on-startup>
  • 2.servlet服务

    浏览器每次访问都会调用service方法

  • 3.servlet销毁

    tomcat关闭,销毁servlet对象

  • 4.重点:

    Servlet对象只有一个单实例,面向多线程访问,线程不安全,要求不要添加数据属性

 

Servlet执行原理

tomcat

1.获得url的项目名,从本tomcat下的webapps下找到对应文件
2.根据url中servlet的url-pattern,从web.xml找到servlet-name,找到servlet-class被访问的servlet全类名
3.Class<> cl = Class.forName(“Servlet全类名”)//获得servlet的类对象
4.Servlet servlet = (Servlet)cl.newInstance();//创建出了类的对象
5.tomcat先调用servlet.init()方法
6.servelt.service(res,resp)调用servlet的service方法
7.服务器将响应结果返回给浏览器
8.浏览器发出第二次请求
9.tomcat会直接根据url-pattern,找到servlet对象,调用servlet.service方法

 

Servlet请求参数


 

概念:浏览器请求servlet携带的数据叫做请求参数

Servlet接收请求参数

  •   request.getParameter(“表单元素的name”);//接收单个数据参数 返回String
  •   request.getParameterValues("表单元素的name")//获得一个名字对应多个值(返回值String数组)

 

浏览器请求Servlet的方式

  • 1.浏览器地址栏
  • 2.form表单的action
  • 3.超链接的href

   

 请求参数乱码问题

  Post提交乱码

  解决:req.setCharacterEncoding("UTF-8");

注意:设置编码,在接收请求参数之前设置。

   Get提交乱码

  • 1.form表单的get方式
  • 2.超链接携带的数据
  • 3.浏览器发送请求参数

修改tomcat的conf/server.xml中<connector/>  加上URIEncoding="UTF-8"

 

 多个Servlet配合工作

请求转发

  作用:多个servlet配合完成一个功能

  核心:

    • 服务器(当前web项目)内部发送流程的跳转
    • forward请求转发连接多个servlet,处于一个请求过程当中 
    • 页面显示信息和浏览器地址栏不一致
RequestDispatcher rdp = request.getRequestDispatcher("转发后下一个servlet的url-pattern");  //获得转发器

rdp.forward(req,resp);  //foward转发,调用转发动作

 

 Request作用域


 

 概念:JavaEE提供的存储数据(命名属性)的空间

命名属性:名字--值

生命周期:一次请求过程(请求转发的servlet正好处于一次请求过程)

存:
    request.setAttribute("名字",值/数据/对象/xxx);

取:
    request.getAttribute("名字");

 

 请求重定向(Redirect)


 

核心

  1.服务器外部跳转

  2.通知浏览器,自动请求下一个要跳转的页面或者Servlet(不需要用户操作)

  3.重定向连接的servlet或者资源,处于两个不同的请求过程

  4.请求重定向后的页面和浏览器的地址一致

resp.sendRedirect("/项目名/资源路径url-pattern");

 

 

 

 

会话技术


 

http协议:无状协议,协议本身不会记录任何信息,两次信息传输之间没有任何关系

应用:浏览器记录,登录验证,验证码,购物车(阉割版)

解释:浏览器和服务器之间,多次交互依然保存数据(状态)的一种机制

 

Cookie(客户端会话技术)

概念:服务器保存在浏览器上的一小段字符串(key=value)

工作机制

  • 1.服务器tomcat创建
  • 2.保存在浏览器
  • 3.浏览器每次访问服务器,都会将服务器(web项目)保存在本浏览器上的cookie发送到服务器上

编码:

1.创建
Cookie cookie = new cookie("key","value");

2.将cookie存入浏览器
response.addCookie(cookie);//将cookie随着响应返回给浏览器

3.设置生命周期
cookie.setMaxAge(秒);

4.获得浏览器请求携带的cookie信息
Cookie[] cs = response.getCookies();
cs[0].getName();//cookie的key
cs[0].getValue();//cookie的value

 

Cookie的特点

1.存在浏览器上   

  优点:分担服务器压力,不会占用服务器资源

  缺点:数据不太安全

2.cookie只能保存字符串,不能保存中文

3.cookie生命周期

  设置0等于删除cookie

  设置-1等于浏览器关闭,cookie丢失

  模式为浏览器关闭,cookie丢失

4.cookie和浏览器一一对应

 

HttpSession(服务器会话技术)

工作机制服务器为每个浏览器分配一个一一对应的存储空间

特点:

  1.存放在服务器

  2.每个浏览器和session一一对应

  3.HttpSession生命周期夸多次请求依然存在

API

1.属性  id

2.获得session 

request.getSession();
第一次访问会创建seesion对象
第2到 n次访问会获得原有的session对象给你

 

 作用

作用域,存储命名属性

存:session.setAttribute("name",值);

取:seesion.getAttribute("name");

移除:session.removeAttribute("name");

 

应用(强制登录/登录验证)

某些资源(HTML、Servlet)的访问需要用户登录后才能访问,否则强制去登录页面

思路 :web项目服务器记住用户

 

Session失效

  • 1.浏览器关闭,session失效
  • 2.session默认保留30分钟。(浏览器和服务器之间,超过30分钟没有请求)
  • 3.session.invalidate() 或者 session.removeAttribute("名字")  主动失效

 

Cookie和Session对比

相同点

  • 和浏览器一一对应
  • 生命周期跨多次请求依然存在

不同点

 cookie

  • 1.存在浏览器
  • 2.只能存字符串(缺点)
  • 3.数据能通过浏览器查看,不太安全(缺点)

session

  • 1.存在服务器
  • 2.可以存对象,可以存入任何类型(优点)
  • 3.数据保存在服务器,相对安全(优点)
  • 4.session中数据过多,会占用服务器资源,给服务器压力(缺点)

 

Seesion原理

机制:

浏览器第一次请求服务器web项目,会为该浏览器创建一个session对象,并获得session的id,id以cookie的形式写回到浏览器。以后每次浏览器请求服务器会自动携带cookie(JesessionId)信息,tomact通过获得cookie中名字为jesessionid的cookie的value值和内部所有的session对象匹配,找到对应的session对该浏览器使用

内部代码实现(局部)
1.浏览器第一次请求服务器
HttpSession session = new XxxxSession();
String id = session.getId();
//将session保存在服务器内存中(集合)
Map<String,HttpSession> map = new ConcurrentHasMap<String,HttpSession>();
Cookie ck = new Cookie("jsessionid",id);
resp.addCookie(ck);

2.浏览器第二次(以后)请求服务器
Cookie[] cks = req.getCookies();
for(Cookie c:cks){
    if(c.getName().equals("jsessionid")){
        String sessionId = c.getValue();
        //根据sessionid找到对应的session对象
        HttpSession session = map.get(sessionId);
    }
}

 

 用户禁用Cookie

 对所有超链接+表单等一切请求服务器的url路径,全部进行url重写

String  重写后的url = resp.encodeUrl(原url地址)

 

 Filter过滤器


 

 概念:Servlet中提供的技术,可以过滤浏览器发出的请求,并且决定放行请求还是中断请求

编码

1.自定义一个java类,实现Filter接口
public class EncodingFilter implements Filter{

//请求经过filter要执行的代码
    doFilter(FilterChain chain){

    //放行之前

    chain,doFilter(req,resp);//放行代码

    //响应回来的代码
    }
}


2.在web.xml中注册信息
<filter>
    <filter-name></filter-name>
    <filter-class></filter-class>
</filter>
<filter-mapping>
    <filter-name></filter-name>
     <url-pattern>过滤请求的servlet或者html的url-pattern</url-pattern>
</filter-mapping>

 

 Filter的url-pattern写法:

  • 1.写多个
  • 2./*---过滤所有请求
  • 3.*.do---过滤请求以.do的请求
  • 4./xxxx/*---过滤路径中url-pattern中,以/xxxx/开头的请求

 

 ServletContext


 

作用域:一个web应用只有一个ServletContext对象

1.获得ServletContext
ServletContext ctx = session.getServletContext();

2.存
ctx.setAttribute("name",值);

3.取
ctx.getAttribut("name");

4.移除
ctx.removeAttribute("name");

 

 常用API

1.全局参数

  web.xml启动加载完毕会将信息存入servletContext

1.在web.xml书写常亮配置
<context-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
</context-param>

2.从servletContext中获得常亮配置
HttpServletRequest reqs = (HttpServletRequest) req;
ServletContext ctx = reqs.getSession().getServletContext();
String value
= ctx.getInitParameter("encoding");
req.setCharacterEncoding(value);
resp.setCharacterEncoding(value);

 

2.web应用内流的相对路径

String 真实路径 = ctx.getRealPath("/项目名下的相对路径");

 

3.动态获取项目名

String ctxtPath = request.getContextPath();

 

监听器


 

 ServletContextListener:监听ServletContext对象的创建和销毁

HttpSessionListener:监听HttpSession对象创建和销毁

ServletRequestListener:监听ServletRequest对象创建和销毁

 

posted @ 2020-06-22 15:47  华哥好棒棒  阅读(156)  评论(0编辑  收藏  举报