java4.1 javaWeb[ servlet ]

四.Servlet

servlet 就是开发动态 web 的一门技术 —— 是实现了 Servlet 接口的 java 程序

  1. 编写一个类,实现 servlet 接口
  2. 把开发好的 java 类部署到 web 服务器中
1. 创建一个Servlet ⭐️

IDEA:用maven创建servlet例子1(详细)

IDEA:用maven创建servlet例子2(mapping)

  • 创建项目

  • 添加依赖

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
    </dependency>
    
  • 在 java 包下创建测试类

    重写 HttpServlet 方法。接收并处理请求,给出响应信息

  • 编写 servlet 映射

    web.xml添加servlet信息

    <web-app>
        <!--注册 Servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.zheng.servlet.HelloServlet</servlet-class>
        </servlet>
        <!--Servlet 请求映射路径-->
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    </web-app>
    
  • 启动 Tomcat 服务

2.ServletContext

web容器在登录的时候,它会为每个web程序都创建一个对应的 ServletContext 对象,它代表了当前的 web 应用

ServletContext slContext = this.getServletContext();

1)共享数据
//【A类】为set类用于存放数据
ServletContext slContext = this.getServletContext();
String uname = "我的名字";
slContext.setAttribute("username",uname);
//【B类】为get类用于获取数据
ServletContext slContext = this.getServletContext();
String username = (String) slContext.getAttribute("username");
//用于设置返回格式及编码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(username);

输出结果:
请添加图片描述

注:两个类所定义的 this.getServletContext() 指向的是同一个对象,因为ServletContext是全局唯一的存在

2)获取初始化参数
<!--配置web应用初始化参数-->
<context-param>
  <param-name>url</param-name>
  <param-value>jdbc:mysql://locahost:3306/stuDB</param-value>
</context-param>
ServletContext slContext = this.getServletContext();
String url = slContext.getInitParameter("url");
resp.getWriter().print(url);
3)转发请求

使用 forward (req,resp) 方法转发

ServletContext slContext = this.getServletContext();
slContext.getRequestDispatcher("/demo3").forward(req,resp);
4)读取资源文件
// resources 下有一个资源 db.properties,打包后会去到"/WEB-INF/classes"目录下
InputStream resource = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(resource);
String name = prop.getProperty("name");
String pass = prop.getProperty("pass");
resp.getWriter().print("name="+name);
resp.getWriter().print("pass="+pass);
3.响应-Response

向浏览器发送数据的方法

//发送其他信息
ServletOutputStream getOutputStream() throws IOException;
//发送文本
PrintWriter getWriter() throws IOException;

向浏览器发送响应头的方法

//响应编码  例:resp.setCharacterEncoding("utf-8");
void setCharacterEncoding(String var1);
//响应字符串长度
void setContentLength(int var1);
//响应类型  例:resp.setContentType("text/html");
void setContentType(String var1);

重定向

resp.sendRedirect("/img"); //url地址栏会改变
4.请求-Request

获取传递参数

//获取某个参数值 uname = req.getParameter("uname");
String getParameter(String var1);  
5.Cookie 和 session
1)区别
  • cookie
    • 客户端技术 - 把用户的数据写给用户浏览器,浏览器保存
    • 是服务端将资源放在 cookie对象中 返回给客户端
    • cookie 大小限制为 4kb
  • session
    • 服务端技术 - 把用户数据写到用户独占 session 中,服务器保存
    • 是用户拿着sessionID去获取对应服务器中对应的资源
2)cookie
  • 创建一个cookie,并添加到 resp
Cookie coo = new Cookie("names", "zhengs");//参数分别为键和值
coo.setMaxAge(30); //【可选项】设置有效期为30秒,不设置情况下关闭浏览器既删除
resp.addCookie(coo);
  • 从请求中获取 cookie
Cookie[] cookies = req.getCookies();//返回的是数组
for(Cookie cookie : cookies){
    out.write(cookie.getName()+" ");
    out.write(cookie.getValue());
}
  • 删除 cookie
coo.setMaxAge(0); //有效期设置为0
3)session
  • 获取 session
HttpSession session = req.getSession();
  • session 属性
//设置属性
session.setAttribute("name",new persion("小郑同学",21));
//获取属性
persion name = (persion)session.getAttribute("name");
//获取id
String id = session.getId();
//判断 session 是不是刚新建的
if (session.isNew()){
    resp.getWriter().write("创建了session ID:"+id);
}else {
    resp.getWriter().write("获得了session ID:"+id);
}
  • 注销
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
  • 可在 xml 配置文件中设置 session 的过期时间
<session-config>
    <!-- session 10分钟后生效 -->
    <session-timeout>10</session-timeout>
</session-config>

五.JSP

Java Server Pages:Java服务器页面

0.准备工作
<!-- JSP依赖 -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>
<!-- JSP表达式 -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- JSP标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
1.基础语法
<%--页面配置--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--表达式--%>
时间:<%= new java.util.Date()%>
<%--脚本片段 跟java一样的--%>
<%
    out.println("输出h1到h5标签");
    for (int i = 1; i < 6; i++) {
        out.println("<h"+i+">标题 "+i+"</h"+i+">");
    }
%>
2.标签库 JSTL

弥补HTML标签的不足

核心标签

<!--引入JSTL标签库-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

注:tomcat的lib目录下可能没有 jst-api 包和 standard 包,将会报错

标签描述
<c:out>用于在JSP中显示数据,就像<%= … >
<c:set>用于保存数据
<c:remove>用于删除数据
<c:if>与一般程序中用的if一样
<c:forEach>基础迭代标签,接受多种集合类型
<c:url>使用可选的查询参数来创造一个URL
<!--请求路径:本页面-->
<form action="index.jsp" method="get">
  <input type="text" name="username" value="${param.username}">
  <input type="submit" value="登录">
</form>
<c:if test="${param.username=='admin'}" var="isAdmin">
  <c:out value="欢迎登录"/>
</c:if>
<c:out value="${isAdmin}" />

六.MVC

请添加图片描述

七、过滤器-Filter

  • Filter :过滤器-过滤网站的数据

    编写过滤器,导包 > 重写

    import javax.servlet.*;
    import java.io.IOException;
    
    public class file implements Filter {
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("过滤器-初始化");
        }
    
        //过滤内容
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain Chain) throws IOException, ServletException {
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("gbk");
            Chain.doFilter(req,resp);//放行,如果不写程序会被拦截
        }
    
        public void destroy() {
            System.out.println("过滤器-销毁");
        }
    }
    

    在 web.xml中配置filter

    <filter>
        <filter-name>filterEncoding</filter-name>
        <filter-class>com.zheng.filter.file</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterEncoding</filter-name>
        <!-- 只有file路径下,才会进入过滤器 -->
        <url-pattern>/file/*</url-pattern>
    </filter-mapping>
    

八.Junit单元测试

test目录下 > texts类 (只要添加 Test 注解,即可直接运行该类)

import org.junit.Test; //导包
public class texts {
    @Test
    public void text(){
        System.out.println("Hello");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值