Servlet

Servlet

1、Servlet简介

  • servlet是sun公司开发动态web的一门技术
  • sun公司在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序只需要完成两个小步骤:
    • 编写一个类实现servlet接口
    • 把开发好的java类部署到web服务器中

把实现了Servlet接口的Java程序叫做Servle

2、Servlet处理的基本流程

  1. 客户端提出HTTP请求
  2. web服务器接收该请求并将其发送给Servlet
  3. Servlet程序将接收该HTTP请求并执行某种处理
  4. Servlet将处理后的结果返回给Web服务器
  5. Web服务器将从Servlet收到的信息响应给客户端

3、自定义Servlet

  • Servlet —> GenericServlet —> HttpServlet —>自定义Servlet

  • 自定义的Servlet类要继承HttpServlet,并且要重写HttpServlet类中的doGet()和doPost()方法Servlet接口有两个默认实现类:HttpServlet,

    1.构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Module;

    2.关于Maven父子工程的理解:
    父项目中会有

    <modules>
    	<module>servlet-01</module>
    </modules>
    

    子项目中会有

    <parent>
    	<artifactId>javaweb-02-servlet</artifacted>
    	<group>com.dll</groupId>
    	<version>1.0-SNAPSHOT</version>
    </parent>
    

    父项目中的java包子项目可以直接使用

    3.Maven环境修改

    1. 修改web.xml为最新版本
    2. 将maven的结构搭建完整

    4.编写一个servlet程序

    1. 编写一个普通类

    2. 实现Servlet接口; 这里我们直接继承HttpServlet

      public class HelloServlet extends HttpServlet {
          //由于get或者post只是请求实现的不同方式,可以相互调用,因为业务逻辑都一样
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //ServletOutputStream outputStream = resp.getOutputStream();
              PrintWriter writer = resp.getWriter();//响应流
              writer.print("hello,servlet");
      
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      

    5.编写Servlet的映射

    ​ 为什么需要映射:我们写的是JAVA程序,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需给他一个浏览器能够访问的路径。

    <!--注册Servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <!--Servlet路径-->
        <servlet-class>com.dll.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--Servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <!--页面的映射路径-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    

    6.配置Tomcat

    7.启动测试

    4、接收参数

  • 由于Servlet本身也存在HttpServletRequest对象的声明,我们可以使用它来接收jsp页面传递过来的参数

  • JSP页面

    <form action="InputServlet" method="post">
        用户名:<input type="text" name="username" />
        性别:
        <input type="radio" name="sex" value="M" checked />男
        <input type="radio" name="sex" value="F" />女
        <input type="submit" value="提交">
    </form>
    
  • 后台接收用户请求

    request.getParameter(name属性);

    public class InputServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 	
            String username = req.getParameter("username") ;
            String sex = req.getParameter("sex") ;
        }
        public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp) ;	
        }
    }
    
  • get方法:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏中显示数据内容,不安全,但高效。

    post方法:请求能够携带的参数没有限制,不会在浏览器的URL地址栏中显示数据内容,安全,但不高效。

5、HttpSession

  • 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象),该 对象有一个唯一的id,一般称之为sessionId。

  • 在Servlet中要想取得一个session对象,则可以通过HttpServletRequest接口完成。

    //1. 获取session对象
    HttpSession session = request.getSession(); 
    //2. 将数据存储到session中 
     session.setAttribute("name", "董乐乐"); 
    //3. 取出session中存储的数据 
    String str =(String) session.getAttribute("name"); 
    //4. 获取session的id 
    String sessionId = session.getId(); 
    
    

    6、Session失效

  1. 关闭所有页面

  2. session.setMaxInactiveInterval(interval);
    session在无操作时的失效时间,单位:秒,如果为0或负数表示永不失效。
    
  3. web.xml配置无操作session失效

    <session-config>
            <session-timeout>60</session-timeout>
    </session-config>
    
  4. session.invalidate();
    session立即失效
    

7、ServletContext对象

public ServletContext  getServletContext();

8、获取application对象

public class AppServlet extends HttpServlet {
        public void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException,IOException {    
        	// 取得application
		    ServletContext application = request.getServletContext();
            System.out.println(“真实路径:" + application.getRealPath("/")); 
            System.out.println("相对路径:" + application.getContextPath());
        }
}

9、Servlet跳转

  • 请求转发:

    RequestDispatcher接口的forward()方法可以完成跳转功能的实现,但是如果要想使用此接口还需要使用ServletRequest接口提供的如下方法进行实例化:

    request.getRequestDispatcher("index.jsp").forward(request, response);
    
  • 重定向
    HttpServletResponse接口的sendRedirect()方法可以完成客户端跳转,但需要注意,此跳转只能传递session范围的属性,而无法传递request范围的属性。

    response.sendRedirect("login.jsp");
    

10、Cookie机制

  • Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。

  • Cookie 是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由Web服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息

//Cookie服务端
// 将正确userName放入ck对象
Cookie ck= new Cookie("UNAME", "Tom")
// 如果不设置时间,则cookie不写入客户端硬盘
ck.setMaxAge(30*60*60*24);  
// 将cookie写入客户端硬盘
response.addCookie(ck);
// 如果有汉字或者其他特殊字符需要进行编码 
Cookie ck=new Cookie("UNAME",URLEncoder.encode(name,"UTF-8"));
//Cookie客户端
<%
        String uname = "";
        // 读取硬盘中的所有Cookie对象
        Cookie[] cks = request.getCookies();
        if(null != cks) {
	for (int i = 0; i < cks.length; i++){
	    if (cks[i].getName().equals("UNAME")){
		uname = cookies[i].getValue();
		// 如果在服务端进行了编码,则需解码
		uname = URLDecoder.decode(uname, "UTF-8");
	    }
    }
%>

11、过滤器(Filter)

  • 过滤器是Servlet技术中最实用的技术,它可以对web服务器管理的所有web资源进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

  • 过滤器实例:过滤器实现同意设置字符编码

    @WebFilter("/EncodeFilter")
    public class EncodeFilter implements Filter {
        public EncodeFilter() {}
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    	request.setCharacterEncoding("UTF-8");
    	response.setContentType("text/html; charset=UTF-8");
    	// 继续传递,这句不能省略
    	chain.doFilter(request, response);
        }
    }
    
    
    <filter>
    	<filter-name>encode</filter-name>
    	<filter-class>com.dll.web.EncodeFilter</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>encode</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
    
    

12、@WebServlet

在Servlet类上加注解@WebServlet,等同于配置web.xml,可以省去在xml中配置Servlet的映射

@WebServlet(value="/urlpattern属性")

13、常见状态码

  • 200 (成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页
  • 400 (错误请求) 服务器不理解请求的语法。
  • 404 (未找到) 服务器找不到请求的网页
  • 500 (服务器内部错误) 服务器遇到错误,无法完成请求

14、Web中的传值

  • form表单传值,注意: 表单元素必须有name属性

  • ?拼接 index.jsp?uname=scott&sex=男
    form表单和?拼接传值方式在后台取值:

    request.getParameter(name)
    
  • page、request、session、application四大范围

    session.setAttribute(name,value);
    Object obj = session.getAtrribute(name);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值