赞
踩
分别用了两种方法:一种是servlet一种是jsp作后端
准备工作:安装 tomcat 8.x.x
apache-tomcat-8.5.59\webapps\ROOT\MyDevice
启动tomcat后,我们在浏览器中输入网址localhost:8080/xxx.html
xxx.html
访问的就是apache-tomcat-8.5.59\webapps\ROOT\xxx.html 的文件
jsp要写:UTF-8编码格式 如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
这是我最终的文件
然后在浏览器中输入localhost:8080 出现如下页面 算是成功启动
查看自己创建的表单
官网地址:https://downloads.mysql.com/archives/c-j/
注意的几个点:
jsp语法:
<%%>
这里面可以添加java代码片段
<%! %>
这里添加java方法
<%=%>
将变量或表达式值输出到页面
<%-- --%>
jsp注释
注意:request.setCharacterEncoding("UTF-8");
必须声明在request.getparamter
的前面,否则中文会乱码的
out.println和system.println.out的区别:
out是jsp内置对象之一,把信息输出到客户端,而System.out.println()则把信息输出到控制台
设备ID
<input type="text" id="device_id" name="device_id" value="">
<br>
设备名称
<input type="text" id="device_name" name="device_name" value="">
String deviceId =request.getParameter("device_id");
String deviceName= request.getParameter("device_name");
mysql5–>mysql8
com.mysql.jdbc.Driver => com.mysql.cj.jdbc.Driver
之前用springbootMVC框架配置的数据库链接:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/csi_db?characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
mvc:
static-path-pattern: /static/**
在JSP里链接数据库是这样写的:
//开始连接数据库 <% try{ Class.forName(" com.mysql.cj.jdbc.Driver"); }catch (ClassNotFoundException classNotFoundException){ classNotFoundException.printStackTrace(); } System.out.println("加载了JDBC驱动"); //然后连接数据库,开始操作数据表 try{ Connection conn = DriverManager .getConnection("jdbc:mysql://127.0.0.1:3306/cly_jspdemo_db?user=root&password=123456&characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai"); System.out.println("准备statement"); Statement statement = conn.createStatement(); System.out.println("已经连接上数据库"); String sql="insert into gas_device(device_id,device_name) values('" + deviceId + "','" + deviceName +"')"; statement.executeUpdate(sql); statement.close(); // conn.close(); //如果使用到结果集 需要注释掉两个连接关闭的close() System.out.println("操作数据完毕 ,关闭了数据库"); %> 添加成功!请返回。 <input type="button" name="listBtn" value="返回列表" onclick="window.location='index.html'"> <% }catch (SQLException sqlexception){ sqlexception.printStackTrace(); %> 添加失败!请返回。 <input type="button" name="listBtn" value="返回列表" onclick="window.location='index.html'"> <% } out.println("页面执行完毕!"); System.out.println("页面执行完毕"); %>
'"+param+"'
(一)选择java 中的web Application
(二) 配置tomcat服务器
(三)创建、拷贝相关的文件
(1) 将之前的记事本文件拷进去,记住是在web目录下,和WEB-INF同级
(2) 创建数据表 device table
package data; import java.sql.Date; /** * @Author ChenLanyu * @CreateTime 2021/10/15 17:40 **/ public class Device { private String id; private String deviceName; private String deviceId; private String objectId; private int devicePort; private Date createTime; public int getDevicePort() { return devicePort; } public void setDevicePort(int devicePort) { this.devicePort = devicePort; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDeviceName() { return deviceName; } public void setDeviceName(String deviceName) { this.deviceName = deviceName; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getObjectId() { return objectId; } public void setObjectId(String objectId) { this.objectId = objectId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
(3) 开始修改之前的jsp做后端的文件,创建servlet
//这是一个servlet demo
public class ServletAction extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
System.out.println("执行了doPost.");
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
System.out.println("执行了doGet");
}
}
区别:doPost 用来处理 post 请求,doGet 用来处理 get 请求
参数:传递的参数相同的都是 HttpServletRequest 和 HttpServletResponse
注意:不要混用post和get
在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式
不过为了防止忘记post get方法用的是哪个,在doPost里调用doGet,在doGet里调用doPost 这样就不会出现调用不起servlet里函数的情况(然后bug也找不到)
————创建servlet遇到的很多坑————
<servlet-class>
要写类的包名<servlet>
<servlet-name>QueryServlet</servlet-name>
<servlet-class>gps.minitor.QueryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryServlet</servlet-name>
<url-pattern>/QueryServlet</url-pattern>
</servlet-mapping>
<form action="" >
(浏览器问路)(四)写Queryservlet、Addservlet、Modifyservlet、代码
(1)Queryservlet 部分代码
//获取query_file.html页面提交后的参数 String deviceId = request.getParameter("device_id"); request.setCharacterEncoding("UTF-8"); System.out.println("页面数据获取完毕"); System.out.println("deviceId = " + deviceId); //开始连接数据库 try { Class.forName(" com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException classNotFoundException) { classNotFoundException.printStackTrace(); } System.out.println("加载了JDBC驱动"); //然后连接数据库,开始操作数据表 try { Connection conn = DriverManager .getConnection("jdbc:mysql://127.0.0.1:3306/cly_jspdemo_db?user=root&password=123456&characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai"); System.out.println("准备statement"); Statement statement = conn.createStatement(); System.out.println("Connect Database OK"); //数据库查询语句 String sql = "select * from gas_device " + "where id like '%" + deviceId + "%'"; System.out.println("即将执行的SQL语句:" + sql); //执行executeQuery //resultset是 sql 结果集 ResultSet rs = statement.executeQuery(sql); List<Device> listDevice = new ArrayList<Device>(); while (rs.next()) { //创建一个Device对象 Device device = new Device(); device.setId(rs.getString("id")); device.setDeviceId(rs.getString("device_id")); device.setDeviceName(rs.getString("device_name")); device.setDevicePort(rs.getInt("device_port")); device.setObjectId(rs.getString("object_id")); device.setCreateTime(rs.getDate("create_time")); listDevice.add(device); } request.setAttribute("listDevice",listDevice); //关闭连接 rs.close(); statement.close(); conn.close(); } catch (SQLException sqlexception) { sqlexception.printStackTrace(); } request.getRequestDispatcher("query_file.jsp") .forward(request, response); }
1 跳转到一个servlet
request.getRequestDispatcher("想跳转的servlet名").forward(request, response);
2 跳转到一个页面
request.getRequestDispatcher("文件路径").forward(request, response);
(2) query_file.jsp
<%@page import="java.util.List"%>
<%@page import="data.Device"%>
<html></html>
在servlet中是这样写的:request.setAttribute("listDevice",listDevice);
在query.jsp中:
<%
List<Device> deviceList = (List<Device>) request.getAttribute("listDevice");
for(Device device:deviceList){//这里循环遍历 得到值
%>
<td><%= device.getId() %></td>
<td><%= device.getDeviceName()%></td>
<td><%= device.getDeviceId()%></td>
<td><%= device.getObjectId()%></td>
<td><%= device.getDevicePort()%></td>
<td><%= device.getCreateTime()%></td>
<%
}
%>
前端存储:localStorage和sessionStorage [html css js]
后台存储:session和application [servlet]
将数据传递给后端
https://localhost:8080//myServlet?userName="1"&userId="2"
localstorage分为localStorage和sessionStorage
localStorage
(1) localStorage 对应 window.localStorage
(2) localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据
(3) 生存期: 如果你想在浏览器窗口关闭后还保留数据,可以使用 localStorage 属性, 该数据对象没有过期时间,今天、下周、明年都能用,除非你手动去删除。
sessionStorage
(1) sessionStorage 对应 window.sessionStorage
(2) sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下
(3) 生存期: sessionStorage的生存期顾名思义,类似于session,只要关闭浏览器(也包括浏览器的标签页),就会被清空。
应用:
保存数据语法:
sessionStorage.setItem("key", "value");
读取数据语法:
var lastname = sessionStorage.getItem("key");
删除指定键的数据语法:
sessionStorage.removeItem("key");
删除所有数据:
sessionStorage.clear();
参考链接 https://www.cnblogs.com/guochangxin/p/9153709.html
(1) 什么是Session?
服务器为了保存用户状态而创建的一个特殊的对象。
当浏览器第一次访问服务器时,服务器创建一个session对象(该
对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId
以cookie的方式发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据
sessionId就可以找到对应的session对象。
(2)如何获取session对象:
HttpSession s = request.getSession();
(3)常用方法
绑订数据:
session.setAttribute(String name,Object obj);
依据绑订名获得绑订值:
Object session.getAttribute(String name);
注:如果绑订名对应的值不存在,返回null。
解除绑订:
session.removeAttribute(String name);
(4)Session 的销毁
为了避免Session中存储的数据过大,Session需要销毁:
1、超时自动销毁。
<session-config> <session-timeout>20</session-timeout> </session-config>
2、调用API方法,主动销毁Session
session.invalidate()
对于application在整个项目中,变量是有且只有1个,所有客户端都共享同一个application对象。
人类社会,就是要解决资源的分配问题
那些应用场景是资源共享呢?
1、 抢火车票
2、 抽奖
3、 统计点击次数
名 | 用法 |
---|---|
console.log(“hello,world”) | 在控制台输出 hello,world |
GET、POST、PUT 和 DELETE 就对应着对这个资源的查,改,增,删 4个操作。具体来说,GET 一般用于获取/查询资源信息,而 POST 一般用于更新资源信息
GET 提交:
请求的数据会附在 url 之后(就是把数据放在 HTTP 协议头中),以 ?分割 url 和 传输数据,多个参数用 & 连接;
POST 提交:
把提交的数据放置在是 HTTP 包的包体中。
因此,GET 提交的数据会在地址栏中显示出来,而 POST 提交,地址栏不会改变。
(2) json对象转换
JSON.parse
(3)微信小程序中
使用method:‘get’, header:可以不填
使用method:‘post’,header:要填–》header:{‘content-type’:‘applicaiton/json’},
(4)前端传入后端的数据名(例如userName)一定要和controller层的函数 public TUser query(String userName)一样!【否则传值为空 我也不知道这是为什么】
(1)Ajax技术需要运行在网站环境中才能生效,这里使用了tomcat服务器
(2)Ajax运行原理:
ajax——服务器的代言人
var xhr = new XMLHttpRequest
xhr.open('get','http://ww.example.com',true); //请求方法、请求url,异步/同步
xhr.send();
xhr.onload = function(){
console.log(xhr.responseText); //通过xhr.responseText获取响应的数据
}
//1.创建ajax对象
var xhr =new XMLHttpRequest();
//2.告诉ajax对象向哪发送请求
xhr.open('get','http://localhost:8080/first')
//3.发送请求
xhr.send();
//4.获取服务器端相应到客户端的数据
xhr.onload = function () {
console.log(xhr.responseText);
}
创建路由地址
服务器响应数据
(1)下载两个jar包 放到lib中
(2)打开project structure 在library中 添加上这两个包
(3)
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
<base href="<%=basePath%>">
request.getSchema()可以返回当前页面使用的协议,http 或是 https;
request.getServerName()可以返回当前页面所在的服务器的名字;
request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是80;
request.getContextPath()可以返回当前页面所在的应用的名字;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。