时间轴:
32天主要学习内容:
1、JavaEE-HTTP-Servlet技术
2、JavaEE-数据库-JDBC&Mybatis
java技术使用历史(2023 ):
JavaEE-HTTP-Servlet&路由&周期:
java学习范围:
3、Java:
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等
框架库:MyBatis,SpringMVC,SpringBoot,Shiro , Log4j ,FastJson等技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充安全:原生开发安全,第三方框架安全,第三方库安全,待补充
JavaEE-HTTP-Servlet&路由&周期:
参考:JAVAEE的核心-Servlet_javaee的核心 csdn-CSDN博客
IDEA的安装(参考文章):http://t.csdnimg.cn/90f6s
对于idea的创建项目的使用:
tomcat安装教程:
Tomcat安装和配置(超详细)_tomcat安装及配置教程-CSDN博客
tomcat在创建后使用:
idea配置tomcat环境(保姆级教程)_idea怎么导入tomcat运行环境-CSDN博客
idea创建后的文件介绍:
package com.example.demo1;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "Hello World!";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
1.其中java的主要内容都放在main目录中。
2.子目录com.example.demo2为创建时拥有的 。
3.运行使用的tomcat为自己下载在本地的。
tomcat的下载:
在发送的32天压缩包中自行下载。
Servlet创建和使用:
Servlet的操作使用步骤如下:
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--------------doGet");
// String id =req.getParameter("id");
// resp.setContentType("utf-8");
// resp.setContentType("text/html");
// PrintWriter out = resp.getWriter();
// out.println("这是GET请求的数据:");
// out.println("id:"+id+"<br>");
// out.flush();
// out.close();
}
}
1.使用doGet方式进行传输
2.运行使用web.xml进行(路由配置和内置配置)
3.public class IndexServlet extends HttpServlet(继承关系继承HttpServlet)
4.其中使用的HttpServlet来自于外部库的maven里的javax.servlet
路由配置:
如下为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">
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.example.servletdemo.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
</web-app>
其中的<servlet-class>的指向必须为完整路径(可以鼠标右键查看完整路径)。
<servlet-mapping>为访问路由,当访问/index时可以进行访问到文件IndexServlet。
如图为tomcat运行配置:
在部署中没有artifacts时:
Idea配置项目的tomcat时候没有Artifacts的最全解决办法_idea配置tomcat没有artifact-CSDN博客
其中可以进行运行配置url的修改(在部署栏目中进行修改)。
在实在不会的时候会写时候,可以使用fix小工具。
根据逻辑访问:http://localhost:8080/demo2_war/index
会在idea变成提示栏中显示-------doGet
如图:
如何在网页上回显?
需要在网页上使用到
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
out.println("name" + name);
System.out.println("--------------doGet");
}
对上述代码进行分析:
String name = request.getParameter("name");理解为写一个字符串理解为name请求一个值name
Print Writer out=response.getWriter();理解为返回回显输出数据
out.printIn("name:"+name);理解为打印数据
对get请求回显做测试:
访问网址:http://localhost:8080/demo2_war/index?name=1
会在下方显示idea的服务器显示 1 。
(get和post使用原理相同,若上面改为req,那下方使用也用req)
对于post请求可以
post代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setContentType("utf-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("这是post提交的数据");
out.println(name);
out.flush();
out.close();
System.out.println("--------------doPost");
1.使用firefox破解版(Hackbar)
在2023年第一天的解压包中
2.使用postman
基础入门第十天说过
内置测试:
可以在代码前面加入@WebServlet('/new')
@WebServlet("/new")
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id=req.getParameter("id");
resp.setContentType("utf-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<hr>id:"+id+"<hr>");
out.flush();
out.close();
super.doGet(req, resp);
}
}
除了doget,dopost还有init,service两个,destroy。
init代码为:
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("--------------init");
// try {
// Class.forName("com.example.servletdemo.NewsServlet");
//
// } catch (ClassNotFoundException e) {
// throw new RuntimeException(e);
// }
}
service代码为:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--------------http service");
super.service(req, resp);
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("--------------Servlet service");
super.service(req, res);
}
destroy代码:
@Override
public void destroy() {
System.out.println("--------------destroy");
super.destroy();
}
他们执行的规律为:
在访问http://localhost:8080/demo2_war/index?id=1时
init只会被执行一次之后不会再执行
destroy会在最后结束服务器的时候执行
service会执行多次
注意:
service执行在doget,dopost之上
先执行Servlet service后执行http service
丰富doget,dopost代码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.setContentType("utf-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("这是post提交的数据");
out.println(name);
out.flush();
out.close();
System.out.println("--------------doPost");
对代码进行解析:
String name = req.getParameter("name");理解为定义字符串name,给予给定值name。
resp.setContentType("utf-8");编码方式设置为utf-8
resp.setContentType("text/html");回显方式为text/html
PrintWriter out = resp.getWriter();数据输出
out.printIn("这是post提交的数据");页面上显示这是post提交的数据。
out.printin(name);页面上输出(当给予name值时)
out.flush();页面刷新
out.close();关闭
System.out.printIn("-------------doPsot")系统输出----------dopost
结果如下:
同理除了在web.xml里面设置,也可以在代码前面加上@WebServlet('/a')进行访问,结果一样。
JavaEE-数据库-JDBC-Mybatis-库(Hibernate):
三种数据库的对比,使用,分析:
http://t.csdnimg.cn/Cs6zH
JDBC的使用:
JavaEE-JDBC基础 - 简书
JDBC由于是java官方自带,所以不需要api接口,但需要数据库驱动jar文件
jar文件下载:
https://mvnrepository.com/
下载5.1.47.jar。之后在demo1下创建lib放入此文件。之后右键此文件然后选择为添加为库
接下来为数据库连接操作:
代码解析在JDBC的使用文章有。(也就是照着那个写的)
使用while进行循环遍历,提取出数据库中的值:
总体代码为: (注意有时候是subheading)
package com.example.demo1;
import java.sql.*;
public class NewsServlet {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/demo1";
Connection connection = DriverManager.getConnection(url, "root", "root");
System.out.println(connection);
String sql="select * from news";
//危险写法
//String vulsql="select * from news where id="+id;
//预编译写法
String safesql="select * from news where id=?";
System.out.println(sql);
Statement statement= connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
int id = resultSet.getInt("id");
String page_title = resultSet.getString("page_title");
String heading = resultSet.getString("heading");
String subheading = resultSet.getString("suheading");
String content = resultSet.getString("content");
String img = resultSet.getString("img");
System.out.println(id+"|"+page_title+"|"+heading+"|"+subheading+"|"+content+"|"+img);
}
}
}
危险写法造成后果:
//危险写法
String vulsql="select * from news where id="+id;
使用union select会造成注入
预编译参考文章:
您的访问出错了
预编译简明说就是不会改变原有的逻辑
总结遇到的问题:
main函数使用和python的main一样,和前文提到的init一样。就是使用前会被自动调用。
req的使用(需要调用service等)
req的使用需要httpservlet的调用
但单独继承调用httpservlet会造成错误:
其中对于idea插件(plugins)安装:
推荐文章:
http://t.csdnimg.cn/ox6ko
http://t.csdnimg.cn/4wfAr
以上为作者安装文件。
以上由番薯小羊卷~,李豆豆喵共同完成。