web 开发
在Java中,动态web资源开发的技术 统称为 javaWeb
ASP
PHP
JSP/Servlet
javaweb中需要大量的导入jar包
Maven 项目架构管理工具
Maven 环境配置
Maven 阿里云镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Servlet就是sun公司开发动态web的一门技术
servlet 接口sun公司有两个默认的实现类:HttpServlet
sun在这些api中提供一个接口叫做:servlet,想要开发一个servlet程序,只需要完成两个小步骤
实现了servlet接口的程序叫做Servlet
关于父子工程:
父项目中会有
<models>
<modult>servlet-01</modult>
</models>
子项目会有
<parent>
<artifactid>javaweb-01</artifactid>
<groupId>com.liu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的java子项目可以直接使用
Servlet 是由web服务器调用,web服务器在收到浏览器请求之后:会
一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一个Servlet可以指定多个映射路径
一个Servlet可以指定通用映射路径
Servlet 可以自定义映射路径
//注册Servlet
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.liu.servlet.HelloServlet</servlet-class>
</servlet>
web容器在启动的时候,他会为每个web程序创建一个对应的ServletContext对象,它代表了当前的web应用
共享数据
package com.liu.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;
import java.io.PrintWriter;
public class GetServlet extends HttpServlet {
@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");
PrintWriter writer = resp.getWriter();
writer.print(userName);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
package com.liu.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;
import java.io.PrintWriter;
public class GetServlet extends HttpServlet {
@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");
PrintWriter writer = resp.getWriter();
writer.print(userName);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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>hello</servlet-name>
<servlet-class>com.liu.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.liu.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
</web-app>
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse;
负责想浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器设置响应的编码
void setCharacterEncoding(String var1); //编码
void setContentLength(int var1);//长度
void setContentLengthLong(long var1);
void setContentType(String var1);//响应类型
向浏览器输出消息
下载文件
获取文件的路径
下载文件名是啥
设置让浏览器支持下载需要的东西
获取下载文件的输入流
创建缓存区,获取OutputStream对象
将FileOutputStream流写入到buffer缓冲区
使用OutputStream将缓存区输出到客户端
package com.liu.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String path = "/Applications/MAMP/JavaDemo/javeweb-maven-01/response/src/main/resources/1.png";
String realPath ="/Applications/MAMP/JavaDemo/javeweb-maven-01/response/src/main/resources/1.png";
System.out.println("下载文件的路径" + realPath);
String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
resp.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode(fileName,"utf-8"));
FileInputStream in = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
ServletOutputStream outputStream = resp.getOutputStream();
while ((len = in.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
in.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.liu.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/jpg");
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(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 7 - 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);
}
}
一个web资源收到客户端请求后,他会通知其他客户端请求另外一个资源,这个过程叫重定向
package com.liu.servlet;
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 RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/r2/img");
}
}
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会封装到HttpServletRequest,通过HttpServletRequest的方法,获得了客户端所有的信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
req.getRequestDispatcher("/success.jsp").forward(req,resp); //请求转发
}
cookie
客户端技术(响应,请求)
从请求中拿到了cookie信息
服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//返回数组
cookie.getName();//获得cookie中的key
cookie.getValue();//获取的cookie的val
new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //new cookie
cookie.setMaxAge(24 * 60 * 60); //cookie 过期时间
resp.addCookie(cookie);//响应cookie
一般会报错在本地的,用户目录下,appdata
浏览器cookie上线300个,每个站点最多200cookie,cookie 大小限制 4KB
session
任何语言都有自己的语法,java中有jsp作为java技术的一种应用,他拥有一些自己的扩充语法,java所有语法都支持
<%--
作用:用来将程序输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 50; i++) {
sum += i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
<jsp:include page="index.jsp"></jsp:include>
<jsp:forward page="/index.jsp">
<jsp:param name="qq" value="www"/>
</jsp:forward>
核心标签是最常用的 JSTL标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:url> | 使用可选的查询参数来创造一个URL |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:foreach> | 基础迭代标签,接受多种集合类型 |
Filter:过滤器,用来过滤网站的数据
package com.liu.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
/**
* chain : 链
*
* 过滤中所有的代码,在过滤特定请求的时候都会执行
* 必须让过滤器继续通行
* chain.doFilter(request, response);
*
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
System.out.println("CharacterEncodingFilter执行前");
chain.doFilter(request, response);//让请求继续执行,如果不写,程序将被拦截停止
System.out.println("CharacterEncodingFilter执行后");
}
//销毁
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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>showServlet</servlet-name>
<servlet-class>com.liu.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showServlet</servlet-name>
<url-pattern>/servlet/showServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>showServlet</servlet-name>
<url-pattern>/showServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.liu.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只要是/servlet 的任何请求,都会被拦截 -->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
package com.liu.servlet;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:3306/eesy?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
String username = "root";
String password = "root";
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
String sql1 = "delete from user where id = 1";
statement.executeUpdate(sql1);//增删改
String sql = "select * from user";
ResultSet resultSet = statement.executeQuery(sql);//查询
String sql2 = "insert into (id,name,birthday)values (?,?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql2);//预编译
preparedStatement.setInt(1, 2);
preparedStatement.setString(2, "aaa");
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
preparedStatement.executeUpdate();
while (resultSet.next()) {
System.out.println("id=" + resultSet.getObject("id"));
System.out.println("username=" + resultSet.getObject("username"));
System.out.println("birthday=" + resultSet.getObject("birthday"));
System.out.println("sex=" + resultSet.getObject("sex"));
System.out.println("address=" + resultSet.getObject("address"));
}
resultSet.close();
statement.close();
connection.close();
}
}
原文:https://www.cnblogs.com/LiuMiao1128/p/14256155.html