Maven:自动导入配置jar包。
Maven项目架构管理工具:核心思想:约定大于配置
Maven:环境优化
1.修改web.xml为最新的
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
web-app>
2.将Maven的结构搭建完整–java-- resources
重写方法快捷键Ctrl+O;
ServletContext:
package com.jun.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username="tiantian";
context.setAttribute("username",username);
System.out.println("小满");
}
}
package com.jun.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HelloServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>helloservlet-name>
<servlet-class>com.jun.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
<servlet>
<servlet-name>getcservlet-name>
<servlet-class>com.jun.servlet.GetServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>getcservlet-name>
<url-pattern>/getcurl-pattern>
servlet-mapping>
web-app>
测试访问
获取初始化参数:
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/mybatisparam-value>
context-param>
<servlet>
<servlet-name>gpservlet-name>
<servlet-class>com.jun.servlet.ServletDemo03servlet-class>
servlet>
<servlet-mapping>
<servlet-name>gpservlet-name>
<url-pattern>/gpurl-pattern>
servlet-mapping>
package com.jun.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url=context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
请求转发
web服务器接收到客户端的Http请求,针对这个请求,分别会创建一个代表请求的HttpServletRequest对象和代表响应的一个HttpServletResponse
如果获取客户端请求过来的参数:找HttpServletRequest
如果要给客户端响应一些信息:找HttpServletResponse
生成验证码:
package com.jun.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器三秒自动刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D)image.getGraphics();
//设置图片背景颜色
g.setColor(Color.white);
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.blue);
g.setFont(new Font(null,Font.BOLD,20));
g.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum() {
Random random=new Random();
String num=random.nextInt(999999)+"";
StringBuffer sb=new StringBuffer();
for (int i = 0; i < 6-num.length(); i++) {
sb.append("0");
}
num=sb.toString()+num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
乱码问题解决
URLEncoder.encode("天意","utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码
Cookies测试
package com.jun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out= resp.getWriter();
Cookie[] cookies = req.getCookies();//服务器从客户端获取Cookie
if(cookies!=null){
out.write("您上次访问的时间是:");
for (int i = 0; i <cookies.length; i++) {
Cookie cookie=cookies[i];
if (cookie.getName().equals("lastlogintime")){
long last=Long.parseLong(cookie.getValue());
Date date=new Date(last);
out.write(date.toLocaleString());
}
}
}
Cookie cookie = new Cookie("lastlogintime",System.currentTimeMillis()+"");//服务器给客户端响应一个Cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
session和cookie的区别
cookie是把用户的数据写给用户的浏览器,浏览器保存
session是把用户的数据写到用户独占session中,服务器保存
session对象由服务器创建
使用场景:
保存一个登录用户的个人信息
购物车信息
在整个网站中经常使用的数据,我们将它保存在session中
使用session
package com.jun.servlet;
import com.jun.servlet.com.jun.pojo.Person;
//import com.jun.servlet.com.jun.pojo.person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给session中存东西
session.setAttribute("name",new Person("jack",18));
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建的
if (session.isNew()){
resp.getWriter().write("创建成功,ID:"+sessionId);
}else{
resp.getWriter().write("已创建"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.jun.servlet.com.jun.pojo;
public class Person {
private String name;
private int age;
public Person(){}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.jun.servlet;
import com.jun.servlet.com.jun.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给session中存东西
Person name = (Person) session.getAttribute("name");
System.out.println(name.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.jun.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();//手动关闭Session
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
什么是JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术
最大特点:写JSP就像在写HTML
区别:
HTML只给用户提供静态的数据
JSP页面中可以嵌入Java代码,用于给用户提供动态数据
JSP脚本片段
<%int sum=0;
for (int i = 0; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"<h1>");
%>
JSP脚本再实现
<%
for (int i = 0; i <5 ; i++) {
%>
<h1>Hello,World! <%=i%>h1>
<%}%>
JSP声明
%!static{
System.out.println("Loading");
}
private int globalVar=0;
public void kuang(){
System.out.println("你好");
}%>
JSP注释不会在客户端显示,html注释会在客户端显示。
修改xml文件需要重启web服务器。
9大内置对象
PageContext:存东西
Request:存东西
Response
Session:存东西
Application:【ServletContext】存东西
config:【ServletConfig】
out
page:几乎不用
exception
pageContext.setAttribute("name1","jack1");//保存的数据只在一个页面中有效
request.setAttribute("name2","jack2");//保存的数据只在一次请求中有效
session.setAttribute("name3","jack3");//保存的数据只在一次会话中有效
application.setAttribute("name4","jack4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
EL表达式:${}
获取数据、执行运算、获取web开发的常用对象
JSP标签
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="tiantian">jsp:param>
<jsp:param name="age" value="18">jsp:param>
jsp:forward>
JSTL表达式
JSTL标签库的使用就是为了弥补html标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样。
<%--
Created by IntelliJ IDEA.
User: 星辰
Date: 2023/7/27
Time: 18:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Title
测试
<%--判断如果提交的用户名是管理员,则登录成功--%>
<%--自闭和标签--%>
编写过滤器
package com.jun.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("chushihua");//初始化web服务器启动,就可以初始化
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("qian");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走
System.out.println("hou");
}
public void destroy() {
System.out.println("xiaohui");//web服务器关闭的时候,过滤就会销毁
}
}
在xml文件中配置
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>com.jun.filter.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/servlet/*url-pattern>
filter-mapping>
实现监听器
package com.jun.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCountListener implements HttpSessionListener {
//一旦创建,就会触发一次这个事件
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
ServletContext ctx = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount=new Integer(1);
}else{
int count=onlineCount.intValue();
onlineCount=new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
在xml中配置
<listener>
<listener-class>com.jun.listener.OnlineCountListenerlistener-class>
listener>
导入数据库依赖
<dependency>
<groupId>com.mysqlgroupId>
<artifactId>mysql-connector-jartifactId>
<version>8.0.33version>
dependency>