这里写目录标题
四.Servlet
servlet 就是开发动态 web 的一门技术 —— 是实现了 Servlet 接口的 java 程序
- 编写一个类,实现 servlet 接口
- 把开发好的 java 类部署到 web 服务器中
1. 创建一个Servlet ⭐️
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");
}
}