javaweb笔记
Maven在javaweb开发中,需要使用大量的jar包需要我们手动去导入;如何能够让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了1、Maven项目架构管理工具我们目前用来就是方便导入jar包的Maven的核心思想:约定大于配置有约束,不要去违反......
Maven
在javaweb开发中,需要使用大量的jar包需要我们手动去导入;
如何能够让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了
1、Maven项目架构管理工具
我们目前用来就是方便导入jar包的
Maven的核心思想:约定大于配置
有约束,不要去违反
Servlet
servlet就是sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
编写一个类,实现Servlet接口
把开发好的Java类部署到web服务器中
实现了Servlet接口的Java程序叫做,Servlet
Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器。Listener监视器
HelloServlet:
1、构建一个普通的Maven项目,删掉里面的src目录,建立Moudel;空的工程就是Maven主工程
在Maven主工程中导入相关的依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
2、关于父子工程的理解:
父工程中会有:
子工程中会有:
子工程没有parent需要手写打入
父工程的java项目子工程继承后直接使用
3、Maven环境优化
将子工程web.xml文件换成最新的
<?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">
</web-app>
子工程中main文件中需要自己搭建结构
4、编写一个Servlet程序
编写一个普通股类
实现一个Servlet接口,我们直接继承HttpServlet
package com.xx.servlet;
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 HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();//响应流
writer.print("hello,servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
编写Servlet的映射
我们写的程序要通过浏览器访问,而浏览器需要连接web服务器。所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径
配置Tomcat后测试
5、Mapping问题
一个Servlet可以指定一个映射路径
一个Servlet可以指定多个映射路径
一个Servlet可以指定通用的映射路径
默认请求路径:
指定一些后缀或者前缀等等...
优先级问题:
指定了固有的映射路径,优先级最高,如果找不到就会默认的处理请求
6、ServletContext (servlet上下文)
response的setContentType() 方法用于设置发送到客户端的响应的内容类型
参数类型有以下几种: text/html application/msword 等
setCharacterEncoding() 用来确保发往服务器的参数的编码格式
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContect对象,它代表了当前的web应用
共享数据
我在这个Servlet中保存的数据,可以在另一个servlet中拿到
应用:
7、HttpServletResponse
web服务器接收到客户端http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse;
如果要获取客户端请求过来的参数:找HttpServletRequest
如果要给客户端响应一些信息:找HttpServletResponse
简单分类:
负责向浏览器发送数据的方法
servletOutputStream getOutputStream() throws IOException;
PrintWriter getwriter() throws IOException;
常见应用
1、向浏览器输出消息
2、下载文件
1、要获取下载文件的路径
2、下载的文件名是啥
3、设置想办法让浏览器能够支持我们下载的东西
4、获取下载文件的输入流
5、创建缓冲区
6、获取OutputStream对象
7、将FileOutputStream流写入到buffer缓冲区
8、使用OutputStream将缓冲区中的数据输出到客户端
package com.xx.com;
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 {
//1、要获取下载文件的路径
String realPath="C:\\Users\\ASUS\\untitled8\\untitled-03\\target\\classes\\1.png";
System.out.println("下载文件的路径:"+realPath);
//2、下载的文件名
String fileName=realPath.substring(realPath.lastIndexOf("\\")+1);
//3、设置想办法让浏览器能够支持(Content-Disposition)我们下载的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
resp.setHeader("Content-Disposition","attachment;fileName"+ URLEncoder.encode(fileName,"UTf-8"));
//4、获取下载文件的输入流
FileInputStream in =new FileInputStream(realPath);
//5、创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
//6、获取OutputStream对象
ServletOutputStream out= resp.getOutputStream();
//7、将FileOutputStream流写入到buffer缓冲区
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
//8、使用OutputStream将缓冲区中的数据输出到客户端
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
验证码功能
验证怎么来的
前端实现
后端实现,需要用到Java的图片类,生产一个图片
package com.xx.com;
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","5");
//在内存中创建一个图片
BufferedImage Image=new BufferedImage(80,20,BufferedImage.TYPE_3BYTE_BGR);
//得到图片
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("pragam","no-cache");
//把图片写给浏览器
boolean write=ImageIO.write(Image,"jpeg",resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random = new Random();
String num=random.nextInt(9999)+"";
StringBuffer sb = new StringBuffer();
for(int i=0;i<4-num.length();i++){
sb.append("0");
}
String s=sb.toString()+num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
实现重定向
B一个web资源收到客户端A的请求后,B他会通知A客户端去访问另一个web资源C,这个过程叫做重定向
常用场景:
用户登录
void sendRedirect(String var1) throws IOException
测试:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* resp.setHeader("Location","image"); resp.setStatus(302); */ resp.sendRedirect("image");//重定向 }
面试题:重定向和转发的区别
相同点:
页面都会发生跳转
不同点:
请求转发的时候,url不会发生变化
重新定向的时候,url会发生变化
8、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest
1、获取前端传递的参数
9、Cookie、Session
存储位置不同: cookie是保存在客户端, session是保存服务器端 2. 存储数据量大小不同: cookie存储是有限的, 不超过4KB, seesion是无限制的;
会话
用户打开一个浏览器,点击了很多的超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话
有状态的会话
一个网站怎么证明来过?
客户端 服务器
1、服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
2、服务端登记你来过了,下次你来的时候我来匹配你;seesion
10、保存会话的两种性质
cookie
客户端技术(响应 请求)
session
服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!
常见场景:网站登陆之后,你下次不用在登陆了,第二次访问直接就上去了
Cookie
1、从请求中拿到cookie信息
2、服务器响应给客户端cookie
Cookie[] cookies=req.getcookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getvalue(); //获得cookie中的value
new Cookie("lastLoginTime",System.out.curremtTimeMillis(),"") //新建一个cookie
cookie.setMaxAge(24*60*60) //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下appdata
一个Cookie只能存一个信息
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
Cookie大小有限制4kb
300个cookie浏览器上限
删除Cookie:
不设置有效期,关闭浏览器,自动失效
设置有效日期为0
Session
服务器会给每一个用户(流浪器)创建一个Session对象
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
用户登录之后,整个网站都可以访问!保存用户信息
Session和Cookie的区别
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
Session把用户的数据写到用户独占Session中,服务器保存(保存重要的信息,减少服务器资源的浪费)
Session由服务器创建
11、JSP
1、Java Server Pages: Java服务器端页面,也和Servlet一样,用于动态Web!
最大特点:
写JSP就像写HTML
区别:
HTML只给用户提供静态的数据
JSP页面中可以嵌入JAVA代码,为用户提供动态数据;
2、JSP原理
思路:JSP到底怎么执行的
JSP本质上就是一个Servlet
//初始化
public void _jspInit(){
}
//销毁
public void _jspDestroy(){
}
//JSPService
publivc void _jspService(. HttpServletRequest request,HttpServletResponse response)
在JSP页面中:
只要是JAVA代码就会原封不动的输出
如果是HTML代码,就会被转换为
out.write("<html>/r/n")
这样的格式,输出到前端
JSP基础语法
JSP作为java技术的一种应用,它拥有一些自己扩充的语法,java语法都支持
JSP表达式
JSP表达作用:用来将程序的输出输出到客户端<%= 变量或者表达式%><%= new java.util.Date()%>
JSP脚本片段
<%
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
out.println("<h1>Sum="+sum+"<h1>");
%>
JSP声明:会被编译到JSP生成的类中!其他的,就会被生成到_jspService方法中!
<%!%>
<%@include%> 拼接页面
12、JavaBean
实体类
JavaBean有特定的写法:
必须要有一个无参构造
属性必须私有化
必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM
ORM:对象关系映射
表--->类
对象--->属性
13、MVC三层架构
什么是MVC:Model view Controller 模型 、视图、控制器
Model
业务处理:业务逻辑(Service)
数据持久层:CRUD(Dao)
View
展示数据
提供连接发起Servlet请求(a,from,img...)
Controller(Servlet)--
接收用户的请求:(req:请求参数、Session信息...)
交给业务层处理对应的代码
控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确:事物)--->Dao层查询用户名和密码是否正确--->数据可
14、Filter(过滤器)
用来过滤网站的数据
处理中文乱码
Filter开发步骤
1、导包
2、编写过滤器
导包不要错
实现Filter接口,重写对应的方法即可
package com.xx.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化: web服务器启动,就以及初始化了,随时等待过滤对象出现!
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/*
Chain:链
1、过滤中的所有代码,在过滤特定请求的时候都会执行
2、必须要让过滤器继续通行
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("GBK");
servletResponse.setCharacterEncoding("GBK");
servletResponse.setContentType("text/html;charset=GBK");
System.out.println("CharacterEncodingFilter执行前...");
filterChain.doFilter(servletRequest,servletResponse);//让我们请求继续走,如果不写,程序到这里就被拦截停止
System.out.println("CharacterEncodingFilter执行后...");
}
//销毁
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
在web.xml中配置 Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.xx.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
15、监听器
实现一个监听器的接口
16、JDBC
jdbc的固定步骤
1.加载驱动
2.连接数据库,代表数据库
3.向数据库发送SQL的对象Statement:CRUD
4.编写SQL(根据业务,不同的SQL)
5.执行SQL
6.关闭连接
package com.xx.test;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//配置信息
String username="root";
String password="123456";
String url="jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//向数据库发送SQL的对象Statement:CRUD
Statement statement = connection.createStatement();
//编写sql
String sql="select * from users";
//执行查询SQL,返回一个ResultSet:结果集
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println("id"+rs.getObject("id"));
System.out.println("name"+rs.getObject("name"));
System.out.println("password"+rs.getObject("password"));
System.out.println("email"+rs.getObject("email"));
}
//关闭连接,释放资源(一定要做)先开后关
rs.close();
statement.close();
connection.close();
}
}
预编译SQL
package com.xx.test;
import java.sql.*;
public class TestJDBC2 {
public static void main(String[] args) throws Exception {
//配置信息
String username="root";
String password="123456";
String url="jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.编写SQL
String sql="insert into users(id,name,password,email) values (?,?,?,?)";
//预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,4);//给第一个占位符?赋值为1
preparedStatement.setString(2,"花荣");//给第2个占位符?赋值为花荣
preparedStatement.setString(3,"123456");//给第3个占位符?赋值
preparedStatement.setString(4,"hr@qq.com");//给第4个占位符?赋值
//执行SQL
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
//关闭连接,释放资源(一定要做)先开后关
preparedStatement.close();
connection.close();
}
}
事物
要么都成功,要么都失败
ACID原则:保证数据的安全
开启事物
事物提交 commit()
事物回滚 rollback()
关闭事物
Junit单元测试
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
简单使用
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行
package com.xx.test;
import org.junit.Test;
public class TestJdbc3 {
@Test
public void test(){
System.out.println("hello");
}
}
更多推荐
所有评论(0)