Servlet API
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
Jsp API
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
静态Web
- html,css
- 提供给所有人看的数据始终不会发生变化!
动态web
- 淘宝,几乎是所有的网站
- 提供给所有看的数据始终会发生变化,每个人在不同的时间不同的地点看到的信息各不相同
- 技术栈:Servlet/JSP , ASP ,PHP
在java中,动态Web资源开发的技术统称为JavaWeb
Web应用程序
web应用程序:可以提供浏览器访问的程序;
一个web应用由多部分组成(静态web 动态web)
- html css js
- jsp servlet
- java程序
- jar包
- 配置文件(properties)
web应用程序编写完毕后,若想提供给外界访问需要一个服务器来统一管理
静态web
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2IzLd1En-1659084486640)(D:\桌面\javaPicture\1646894856582.png)]
缺点 :web页面无法动态更新,所有用户看到都是同一个页面
动态web
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVq4kW94-1659084486641)(D:\桌面\javaPicture\1646894977372.png)]
缺点:加入服务器的动态web资源出现了错误,需要重新编写后台程序,停机维护重新发布
优点:web页面可以动态更新,所有用户看到都不是同一个页面,可以与数据库交互.
安装TomCat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7yIv0JBO-1659084486641)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225090644354.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEzELJNn-1659084486643)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225090657294.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j9NNU3I6-1659084486644)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225092419637.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpY93FnM-1659084486645)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225092923207.png)]
测试网站:localhost:8080
可能遇到的问题:
- java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9KLcJDK-1659084486645)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225093824107.png)]
可以配置端口号
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置主机名称 需先到host文件里修改本机名
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VU5zK0Z9-1659084486646)(C:\Users\ADMINI~1\AppData\Local\Temp\1646910035634.png)]
访问网站过程
- 输入一个域名
- 检查本机host文件下有没有该域名的映射,有的话返回对应的IP地址,如果该ip地址有对应的web应用程序,则直接访问
- 没有该域名的映射的话去DNS服务器找,找到的话就返回改地址并访问,没有的话就返回找不到;
Http响应
200:请求响应成功
3xx:请求重定向
404:资源不存在
5xx:服务器代码错误 500 502:网关错误
Maven
我为什么要学习这个技术
- 在javaweb开发中,需要使用大量的jar包,我们手动去导入;
- 如何能够让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了
Maven项目架构管理工具
我们目前就是方便导入jar包的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yj1cBZaR-1659084486646)(C:\Users\ADMINI~1\AppData\Local\Temp\1646920849742.png)]
配置环境变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lWjXtlo-1659084486647)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225100546450.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ueSA8CZ9-1659084486647)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225100610257.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlVq3iUQ-1659084486647)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225100507839.png)]
阿里云镜像
-
镜像:mirrors
- 作用:加速我们的下载
-
国内建议使用阿里云的镜像
-
<!--配置阿里云镜像--> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
![image-20211225102033517](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225102033517.png)
## 测速是否配置成功
![image-20211225103337412](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225103337412.png)
![image-20211225103429106](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225103429106.png)
# 本地仓库
在本地的仓库,远程仓库;
**建立一个本地仓库**: localRepository
```xml
<localRepository>D:\环境\apache-maven-3.8.4\maven-repo</localRepository>
发布一个web网站
-- webapps:Tomcat服务器的web目录
-ROOT
-zhangyu:网站的目录名
-WEB-INF
-classes:java程序
-lib.web 应用锁依赖的jar包
-web.xml:网站配置文件
-index.html
-static
-css
-js
img
.....
在IDEA中使用Maven
- 启动idea
- 创建一个maven项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Npe0XuW6-1659084486648)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225104637447.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHVu3nJ5-1659084486648)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225104820566.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMfXqlCa-1659084486649)(D:\桌面\javaPicture\1646984512388.png)]
创建一个普通的Maven项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNwwMhHR-1659084486649)(D:\桌面\javaPicture\1646985047072.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkX0UxgC-1659084486650)(D:\桌面\javaPicture\1646985127659.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOuVMSZM-1659084486650)(D:\桌面\javaPicture\1646985070501.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVTx5b9H-1659084486650)(D:\桌面\javaPicture\1646985241397.png)]
标记文件夹功能
方法一
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6DbAOQv-1659084486651)(D:\桌面\javaPicture\1646985494990.png)]
方法二
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPn5kj43-1659084486651)(D:\桌面\javaPicture\1646985848230.png)]
配置Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKVG0fGn-1659084486651)(D:\桌面\javaPicture\1646985934148.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRxgIwLE-1659084486651)(D:\桌面\javaPicture\1646986066256.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLH7eMw7-1659084486652)(D:\桌面\javaPicture\1646986165167.png)]
解决警告:
为什么会有警告:我们访问网站必须要指定一个文件夹的名字(必须要解决该警告)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQMcC0sI-1659084486652)(D:\桌面\javaPicture\1646986479939.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hRXDlus-1659084486652)(D:\桌面\javaPicture\1646986631734.png)]
pom文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sxcJVEG-1659084486653)(D:\桌面\javaPicture\1647002132882.png)]
<!-- 在bulid中配置resource 来防止资源导出失败的问题 并不是每个人都会遇到 遇到时可以使用-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
问题
maven默认web项目中web.xml版本问题
替换
webapp 头文件
<?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">
</web-app>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvApzPy2-1659084486654)(D:\桌面\javaPicture\1647009308427.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZVkr6kN-1659084486654)(D:\桌面\javaPicture\1647009348228.png)]
source和javadoc爆红 下载source和doc就行
Servlet
-
Sun公司开发动态web的一门技术
-
Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet只需要两个你步骤
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
把实现了Servlet接口的java程序叫做Servlet;
HelloServle
Servlet API
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
Jsp API
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency>
-
构建一个Maven项目,删掉里面的src目录,以后就在这个项目里建Moudel;这个空的工程就是Maven工程;
-
关于Maven父子工程的理解:
-
父项目中的依赖子项目可以直接使用 //son extends father
-
Maven环境优化
- 修改web.xml为最新的
- 将maven的结构搭建完成(java resources)
-
编写一个servlet程序
- 编写一个普通类
- 实现Servlet接口,直接继承HttpServlet
package com.DYZ;
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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流 回应请求(写)
writer.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
编写Servlet的映射
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接Web服务器,所以我们需要在web服务中注册我们写的Servlet.还需给他一个浏览器能够访问的路径;
<?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> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 在web服务器上注册的地址--> <servlet-class>com.DYZ.HelloServlet</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>hello</url-pattern> </servlet-mapping> </web-app>
-
配置Tomcat
配置项目发布的路径
Servlet原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zkoikDP-1659084486655)(D:\桌面\javaPicture\1647606827204.png)]
Mapping问题
-
一个Servlet可以有多个映射路径
-
一个Servlet可以指定一个通用的映射路径
<servlet-mapping> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>/hello/*</url-pattern> <!-- /hello 后面输任何数据都能进入目标网址不输也可以> </servlet-mapping>
-
指定映射路径的后缀
<servlet-mapping> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>*.DYZ</url-pattern> <!-- 只要以.DYZ结尾的映射路径都可以访问到目标Servlet网址> </servlet-mapping>
-
*.hello前面不能加路径
<!-- servlet的请求路径--> <servlet-mapping> <!-- servlet名字--> <servlet-name>error</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>/*.hello</url-pattern> </servlet-mapping>
<!-- servlet的请求路径-->
<servlet-mapping>
<!-- servlet名字-->
<servlet-name>error</servlet-name>
<!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
<url-pattern>/hello/*.hello</url-pattern>
</servlet-mapping>
-
优先级
当Servlet映射的地址是/*首页将默认为该页,如果输入另一个Servlet映射的地址则会跳转到该地址对应的页面,不会/*页面冲突
<!--注册Servlet--> <servlet> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 在web服务器上注册的地址--> <servlet-class>com.DYZ.HelloServlet</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <!-- servlet名字--> <servlet-name>hello</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>/hello</url-pattern> </servlet-mapping> <!--注册Servlet--> <servlet> <!-- servlet名字--> <servlet-name>error</servlet-name> <!-- 在web服务器上注册的地址--> <servlet-class>com.DYZ.error</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <!-- servlet名字--> <servlet-name>error</servlet-name> <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址--> <url-pattern>/*</url-pattern> </servlet-mapping>
ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext,它代表了当前的web应用.
整个会话和整个web应用的区别
● 客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
● 使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。关于Cookie和Session的相关知识,将在下面的小节进行详细讲解。
共享数据
我在Servlet中保存的数据,可以在另一个Servlet中拿到
-
创建放置数据的类
package com.DYZ.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 { System.out.println("Hello"); // this.getInitParameter()//初始化参数 // this.getServletConfig();//servlet配置 ServletContext context = this.getServletContext();// String userName="张宇"; context.setAttribute("userName",userName);//设置一个键值对的形式保存在Servletcontext中将一个数据保存在 } }
-
创建读取数据的类
package com.DYZ.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 useName = (String) context.getAttribute("userName"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf8"); PrintWriter writer = resp.getWriter(); writer.println("名字为:"+useName); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
配置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>hello1</servlet-name> <servlet-class>com.DYZ.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello1</servlet-name> <url-pattern>/helloservlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>hello2</servlet-name> <servlet-class>com.DYZ.servlet.getServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello2</servlet-name> <url-pattern>/getservlet</url-pattern> </servlet-mapping> </web-app>
获取初始化参数
<!-- 创建初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:8080/mybatis</param-value>
</context-param>
package com.DYZ.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 ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");//获取初始化参数;
resp.getWriter().println(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
请求转发
转发的特点
-
地址栏不发生变化,显示的是上一个页面的地址
-
请求次数:只有1次请求
-
请求域中数据不会丢失
-
//转发时页面名称是什么路径就是什么不需要加斜杠(如果页面路径没有斜杠 转发到Servlet页面有斜杠)
<servlet>
<servlet-name>ServletDemo02</servlet-name>
<servlet-class>com.DYZ.servlet.ServletDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo02</servlet-name>
<url-pattern>/servletdemo02</url-pattern>
</servlet-mapping>
package com.DYZ.servlet;
import javax.servlet.RequestDispatcher;
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 ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//转发的请求路径
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/getservlet");
//调用forward进行转发
requestDispatcher.forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
读取资源文件
资源文件的绝对路径要在是在WEB-INF里的路径而不是在classes里的(class里是java自己生成的100%会有 web-inf里的是网页生成如果没有需要加一段web代码)
<!-- 在bulid中配置resource 来防止资源导出失败的问题 并不是每个人都会遇到 遇到时可以使用-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fofo5Utt-1659084486660)(C:\Users\ADMINI~1\AppData\Local\Temp\1647236509123.png)]
properties
username=root
password=123456
<servlet>
<servlet-name>ServletDemo04</servlet-name>
<servlet-class>com.DYZ.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo04</servlet-name>
<url-pattern>/servletdemo04</url-pattern>
</servlet-mapping>
package com.DYZ.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.InputStream;
import java.util.Properties;
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(stream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf8");
resp.getWriter().println("账号:"+username);
resp.getWriter().println("密码:"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpServletResponse
web服务器接收到客户端http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletRequest
简单分类
负责向浏览器发送数据的方法
-
public PrintWriter getWriter() throws IOException;
-
public ServletOutputStream getOutputStream() throws IOException;
负责向浏览器发送响应头
-
public void setCharacterEncoding(String charset);
-
public void setContentType(String type);
public void setContentLengthLong(long len);
-
public void setContentLength(int len);
-
public void setDateHeader(String name, long date); public void addDateHeader(String name, long date); public void setHeader(String name, String value); public void addHeader(String name, String value); public void setIntHeader(String name, int value); public void addIntHeader(String name, int value);
响应状态码
public static final int SC_CONTINUE = 100; public static final int SC_SWITCHING_PROTOCOLS = 101; public static final int SC_OK = 200; public static final int SC_CREATED = 201; public static final int SC_ACCEPTED = 202; public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; public static final int SC_NO_CONTENT = 204; public static final int SC_RESET_CONTENT = 205; public static final int SC_PARTIAL_CONTENT = 206; public static final int SC_MULTIPLE_CHOICES = 300; public static final int SC_MOVED_PERMANENTLY = 301; public static final int SC_MOVED_TEMPORARILY = 302; public static final int SC_FOUND = 302; public static final int SC_SEE_OTHER = 303; public static final int SC_NOT_MODIFIED = 304; public static final int SC_USE_PROXY = 305; public static final int SC_TEMPORARY_REDIRECT = 307; public static final int SC_BAD_REQUEST = 400; public static final int SC_UNAUTHORIZED = 401; public static final int SC_PAYMENT_REQUIRED = 402; public static final int SC_FORBIDDEN = 403; public static final int SC_NOT_FOUND = 404; public static final int SC_METHOD_NOT_ALLOWED = 405; public static final int SC_NOT_ACCEPTABLE = 406; public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; public static final int SC_REQUEST_TIMEOUT = 408; public static final int SC_CONFLICT = 409; public static final int SC_GONE = 410; public static final int SC_LENGTH_REQUIRED = 411; public static final int SC_PRECONDITION_FAILED = 412; public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413; public static final int SC_REQUEST_URI_TOO_LONG = 414; public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; public static final int SC_EXPECTATION_FAILED = 417; public static final int SC_INTERNAL_SERVER_ERROR = 500; public static final int SC_NOT_IMPLEMENTED = 501; public static final int SC_BAD_GATEWAY = 502; public static final int SC_SERVICE_UNAVAILABLE = 503; public static final int SC_GATEWAY_TIMEOUT = 504; public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
常用应用
-
向浏览器输出消息
-
下载文件
-
要获取文件的路径
-
下载文件名是什么
-
设置办法让浏览器能够支持下载我们需要的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取OutputStream对象
-
将FileOutputStream流写入到buffer缓冲区
-
使用OutputStream将缓冲区中的数据输入到客户端
package com.DYZ.Servlet; import javax.servlet.ServletContext; 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.io.InputStream; import java.net.URLEncoder; public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // - 要获取文件的路径 ServletContext context = this.getServletContext();//获取上下文 String realPath = "D:\\桌面\\project\\JavaWeb\\JavaWeb-01-Servlet\\response\\src\\main\\resources\\1.jpg";//获取文件的绝对路径 // - 下载文件名是什么 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//引用字符串中的字符要变为转义字符 // - 设置办法让浏览器能够支持下载我们需要的东西 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF8")); /* 格式说明: content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm ) 字段说明:Content-Disposition为属性名disposition-type是以什么方式下载,如attachment为以附件方式下载 */ // - 获取下载文件的输入流 FileInputStream fileInputStream = new FileInputStream(realPath); // - 创建缓冲区 byte[] b=new byte[1024]; int count; // - 获取OutputStream对象 ServletOutputStream outputStream = resp.getOutputStream(); // - 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输入到客户端 while((count=fileInputStream.read(b))!=-1){ outputStream.write(b,0,count); } fileInputStream.close(); outputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
-
验证码功能
验证怎么来的?(熟悉就行)
-
package com.DYZ.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 { //图片设置每3秒自动刷新一次 resp.setHeader("refresh","0.1"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80, 100, BufferedImage.TYPE_INT_RGB); //得到图片 创建画笔 Graphics2D graphics =(Graphics2D) image.getGraphics(); //设置图片背景颜色 graphics.setColor(Color.white); graphics.fillRect(0,0,80,100); //给图片写数据 graphics.setColor(Color.blue); graphics.setFont(new Font(null,Font.BOLD,20)); graphics.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(999999)+""; StringBuffer stringBuffer = new StringBuffer(); for (int i=0;i<7-num.length();i++){ stringBuffer.append(0); } String s=stringBuffer.toString()+num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
重定向
- 地址栏:显示新的地址
- 请求次数:2次
- 根目录:http://localhost:8080/ 没有项目的名字
- 请求域中的数据会丢失,因为是2次请求
package com.DYZ.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.setHeader("Location","/r/download");
resp.setStatus(302); //设置状态码
*/
resp.sendRedirect("/response_war/download1");//重定向 需要加上Tomcat中的上级目录
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
重定向和转发的区别
相同点:都会实现页面跳转
不同点:请求转发,url不会发生变化,重定向url会发生变化(变化为重定向页面的url)
对于重定向中的第一个/ :表示的是项目服务器的根目录 表示的是localhost:8080/ 如果不指定mg就无法找到具体项目,出现404无法找到资源路径。
对于请求转发中的第一个/:表示服务器中项目的名称mg 表示”localhost:8080/mg(项目的名)/ 也就是到大了webapp
登录重定向
<html>
<body>
<h2>Hello World!</h2>
<!-- 点提交就会跳转到login界面-->
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
package com.DYZ.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 RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入请求了!");
//处理请求
String username = req.getParameter("username");//从请求中获取参数
String password = req.getParameter("password");//从请求中获取参数
System.out.println(username+":"+password);
resp.sendRedirect("/response_war/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBQNdf5o-1659084486661)(D:\桌面\javaPicture\1647489739540.png)]
获取前端传送的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4orJpKGG-1659084486662)(D:\桌面\javaPicture\1647490153696.png)]
请求转发
index.jps
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/15 0015
Time: 13:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<div>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名: <input type="text" name="username"> </br>
密码: <input type="password" name="password"></br>
爱好:
<input type="checkbox" name="hobbies" value="swim">游泳
<input type="checkbox" name="hobbies" value="basketball">篮球
<input type="checkbox" name="hobbies" value="game">游戏
</br>
<input type="submit" name="submit">
</form>
</div>
</body>
</html>
LoginServlet
package com.DYZ.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.util.Arrays;
public class LonginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接受前端输入数据时采用的编码 防止接受乱码
req.setCharacterEncoding("utf8");
//设置回复给前端时采用的编码 防止接受乱码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobbies");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
//通过请求转发
resp.setContentType("text/html");
//这里的/代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
success.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/17 0017
Time: 12:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆成功</title>
</head>
<body>
<h1>登陆成功</h1>
</body>
</html>
Cookies Sessions
会话
用户打开一个浏览器,点击了很多链接,访问多个web资源,关闭浏览器,这个过程可以称之为回话
有状态回话
一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话.
保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以吧信息或数据放在session中
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
package com.DYZ.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 Cookiedemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=utf8");
resp.setCharacterEncoding("utf8");
PrintWriter out = resp.getWriter();
//客户端向服务器发送请求request,其中携带cookie,从request中获取cookie
Cookie[] cookies = req.getCookies();
if(cookies!=null){
out.println("你上一次记访问的时间是:");
for (Cookie cookie : cookies) {
if(cookie.getName().equals("LastLoginTime")){
//new Date()里面必须是Long类型的时间数据 所以通过parseLong将字符串转换成Long
long lastTime = Long.parseLong(cookie.getValue());
out.write(new Date(lastTime).toLocaleString());
}
}
}
//服务器给客户端一个cookie
Cookie cookie = new Cookie("LastLoginTime",System.currentTimeMillis()+""); //+""变成字符串 或者用String.valueof
//设置cookie的有效期为1天
cookie.setMaxAge(60*60*24);
//给当前访问的客户端设置cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
cookie一般会保存在本地的用户目录下的appdata下
删除cookie
package com.DYZ.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;
public class Cookiedemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie 与之前设置的cookie的name(键)要相同 因为键不能重复 相同的键就会替换掉之前的值
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
//设置cookie的有效值为0
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象.
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在.
- 用户登录只有,整个网站他都可以访问.
package com.DYZ.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class Sessiondemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=utf8");
//从客户端得到一个session(服务器会给自动每个客户端创建一个session,每个session都会自带一个sessionId(类似于创建cookie))
HttpSession session = req.getSession();
//往session中存东西
session.setAttribute("name",new Person("张宇",20)); //既可以存字符串也可以存对象
//得到sessionId
String id = session.getId();
//判断session是不是新的
if(session.isNew()){
System.out.println("恭喜Session成功创建,ID为"+id);
resp.getWriter().println("恭喜Session成功创建,ID为"+id);
}
else{
System.out.println("Session已经在服务器中存在了,ID为"+id);
resp.getWriter().println("Session已经在服务器中存在了,ID为"+id);
}
//系统自动创建Session时的操作
// Cookie cookie = new Cookie("JSESSIONID", "sessionId");
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.DYZ.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 Sessiondemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setCharacterEncoding("utf8");
resp.setContentType("text/html;charset=utf8");
//得到Session
HttpSession session = req.getSession();
Person name =(Person) session.getAttribute("name");
System.out.println("Session的属性为"+name.toString());
resp.getWriter().println("Session的属性为"+name.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
手动注销session
package com.DYZ.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 SessionDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//手动注销session
session.removeAttribute("name"); //移除session属性
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
自动注销
<session-config>
<!-- session失效时间 以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>
Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session由服务器创建,用户通过Servlet地址访问服务器,服务器传给用一个SessionID(即cookie),Session中保存的东西在服务器中,通过唯一的一个SessionId访问.
Session使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
Jsp
什么是jsp
java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术!
最大的特点:
- 写JSP就像在写HTML
- 区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据.
JSP原理
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
Jsp最终也会被转换成为一个java类
JSP本质上就是一个Servlet(继承了Servlet接口的java程序)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5oBPSbWR-1659084486663)(D:\桌面\javaPicture\1647606379022.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDIhAl4T-1659084486664)(C:\Users\ADMINI~1\AppData\Local\Temp\1647606757491.png)]
在JSP页面中只要是JAVA代码就会原封不动的输出;如果是HTML代码就会被转换为
out.write("<html>\r\n")
这样的格式
JSP基础语法
JSP表达式和脚本片段
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/18 0018
Time: 20:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--JSP表达式 作用:将程序的输出 输出到客户端--%>
<%=new java.util.Date()%>
<%--脚本片段--%>
<%
int sum=0;
for (int i=0;i<10;i++){
sum=sum+i;
}
out.println("<h1>SUM="+sum+"</h1>");
%>
</body>
</html>
<%
for(int i=0;i<10;i++){
%>
<%=i%>或者 ${i}
<h1>Hello world!</h1>
<%
}
%>
JSP声明
<%--放在jspservice方法外面,所以没有jsp的内置方法out,需要用java的输出方法--%>
<%!
static{
System.out.println("这是在");
}
public void Zhang(){
System.out.println("张宇!!!");
}
%>
定制错误页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwqmXpNP-1659084486665)(D:\桌面\javaPicture\1647611267772.png)]
<%@ page errorPage="error/500.jsp" %>
或者在web.xml界面
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<body>
<%-- 拼接页面 本质还是三个页面 顶部和底部页面独立到主体外面--%>
<%@include file="Common/TOP.jsp"%>
<h1>主体</h1>
<%@include file="Common/foot.jsp"%>
<hr>
<jsp:include page="Common/TOP.jsp"></jsp:include>
<jsp:include page="Common/foot.jsp"></jsp:include>
</body>
JSP内置对象及其作用域
<%@ page import="java.beans.AppletInitializer" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 15:27
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("name","张宇");//保存的数据只在一个页面中有效
request.setAttribute("name2","张宇");//保存的数据只在一次请求中有效
session.setAttribute("name3","张宇");//保存的数据只在一次绘画中有效,即打开和关闭浏览器
application.setAttribute("name4","张宇");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%--EL表达式--%>
<%
String name =(String) pageContext.getAttribute("name");
String name2 =(String) request.getAttribute("name2");
String name3 =(String) session.getAttribute("name3");
String name4 =(String) application.getAttribute("name4");
%>
<h1>属性为:</h1>
<h1>${name}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>
</body>
</html>
request里面存用户看完就没用的比如新闻
session存放用户看完还有用的 比如购物车
application存放一个用户看完了其他用户还有用的比如聊天数据
JSP标签 JSTL标签 EL表达式
EL表达式:${}
- 获取数据
- 执行运算
- 获取web 开发的常用对象
jsp标签
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="jsp5.jsp">
<jsp:param name="name" value="zhangyu"/>
<jsp:param name="age" value="22"/>
</jsp:forward>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>
</html>
JSTL标签库使用步骤
- 引入对应的taglib
- 使用其中的方法
- 在Tomcat lib文件夹下也需要引入jstl包和standard包
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 16:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="jsp6.jsp" method="get">
<%-- EL表达式获取表单中的数据
${param.参数名}}--%>
用户名: <input type="text" name="username" value="${param.username}">
<hr>
<input type="submit" value="登录">
<!-- 判断是不是管理员登录-->
<c:if test="${param.username=='admin'}" var="isadmin">
<c:out value= "欢迎您,管理员!"/>
</c:if>
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 17:36
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:set var="score" value="85"/>
<c:choose>
<c:when test="${score}>=90">
成绩优秀
</c:when>
<c:when test="${score}>=80">
成绩良好
</c:when>
<c:when test="${score}>=70">
成绩中等
</c:when>
</c:choose>
</body>
</html>
JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表–>类
- 字段—>属性
- 行记录—>对象
<%@ page import="com.DYZ.pojo.Person" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/19 0019
Time: 18:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// Person person = new Person();
// person.setAddress();
// person.setAge();
// person.setId();
// person.setName();
%>
<jsp:useBean id="person" class="com.DYZ.pojo.Person" scope="page"/>
<jsp:setProperty name="person" property="address" value="江宁区"/>
<jsp:setProperty name="person" property="name" value="张宇"/>
<jsp:setProperty name="person" property="age" value="22"/>
<jsp:setProperty name="person" property="id" value="1"/>
ID:<jsp:getProperty name="person" property="id"/>
姓名:<jsp:getProperty name="person" property="name"/>
年龄:<jsp:getProperty name="person" property="age"/>
地址:<jsp:getProperty name="person" property="address"/>
</body>
</html>
MVC 三层架构
什么是MVC:Model view Controller 模型 视图 控制器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jCYsG5OT-1659084486666)(D:\桌面\javaPicture\1647753195543.png)]
Model(模型层)
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD (Dao)
View(视图层)
- 展示数据
- 提供链接发起Servlet请求(a form img…)
Controller(控制层)
- 接收用户请求:(requ:用户请求参数,Session信息)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录--->接收用户登录的请求--->处理用户请求(获取用户登录的参数,username password) --->交给业务层处理登录业务(判断用户密码是否争取)--->持久层查询用户名和密码是否正确--->数据库-->正确 跳转到视图层
Filter
Filter:过滤器,用来过滤网站的数据:
- 处理中文乱码
- 登录验证
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42vEflfW-1659084486666)(D:\桌面\javaPicture\1647754175133.png)]
Filter开发步骤:
-
导包
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
-
编写过滤器
-
导Filter包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuRYOeXK-1659084486667)(D:\桌面\javaPicture\1647755099234.png)]
-
package com.DYZ.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化 Web服务启动时初始化,随时等待过滤对象出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//Chain:链
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf8");
servletResponse.setCharacterEncoding("utf8");
servletResponse.setContentType("text/html;charset=utf8");
System.out.println("执行前");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走下去,如果不写,程序到这里就会被拦截停止
System.out.println("执行后");
}
//销毁 Web服务器关闭的时候,过滤器就会销毁
@Override
public void destroy() {
}
}
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Filter</filter-name>
<filter-class>com.DYZ.filter.CharacterEncodingFilter</filter-class>
</filter>
<!-- servlet下的路径都会执行过滤器-->
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<!--如果有多个网站需要过滤可以写多个mapping 例如sys下-->
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
监听器
实现一个监听器接口
-
编写一个监听器
-
实现一个监听器的接口
package com.DYZ.listener; import com.sun.corba.se.spi.orbutil.fsm.Input; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSessionContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class OnlineCountListener implements HttpSessionListener { //创建Session监听 @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { //需要监听整个web应用(即整个网站) 所以需要getServletContext() 整个web应用共享ServletContext的键值 ServletContext sct = httpSessionEvent.getSession().getServletContext(); Integer onlineCount = (Integer)sct.getAttribute("OnlineCount"); if(onlineCount==null){ onlineCount=1; } else { onlineCount=onlineCount+1; } sct.setAttribute("OnlineCount",onlineCount); System.out.println(sct.getAttribute("OnlineCount")); } //监听器销毁 销毁一个 减一个 @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext sct = httpSessionEvent.getSession().getServletContext(); Integer onlineCount = (Integer)sct.getAttribute("OnlineCount"); if(onlineCount==null){ onlineCount=0; } else { onlineCount=onlineCount-1; } sct.setAttribute("OnlineCount",onlineCount); } }
-
注册监听器
<listener> <listener-class>com.DYZ.listener.OnlineCountListener</listener-class> </listener>
-
注销手动或自动注销session
Filter实现权限拦截
案例要求:需要用户输入正确的用户名之后才能进入主页,并且用户注销与以后不能再通过输入主页的网址进入(报错,进入error页面).
-
用户输入正确的用户名之后,向Session中存放用户的数据,因为使用的是重定向,数据不会保留,所以使用Session(数据存储在web服务器中)
package com.DYZ.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 LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); if (username.equals("admin")){ resp.sendRedirect(req.getContextPath()+"/success.jsp"); //session的值就是个贯通全局的标记,用这个标记可以来判断是否输入正确的用户名 //此处的 User_Session可以创建一个 Constant类来专门存放,该常量一旦更改,只需要去该类中更改一次即可 req.getSession().setAttribute("User_Session",req.getSession().getId()); } else resp.sendRedirect(req.getContextPath()+"/error.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.DYZ.Servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
-
进入主页的时候判断用户是否已经登录(即Session中是否有(User_Session)对应的属性.在过滤器中
package com.DYZ.Servlet; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class SysFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req1 = (HttpServletRequest) req; HttpServletResponse resp1 = (HttpServletResponse) resp; Object user_session = req1.getSession().getAttribute("User_Session"); if(user_session==null){ resp1.sendRedirect(req1.getContextPath()+"/error.jsp"); } filterChain.doFilter(req,resp); } @Override public void destroy() { } }
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.DYZ.Servlet.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<!-- 进入success界面必须要经过过滤器来判断,因此可以将success界面放入一个固定的文件夹-->
<url-pattern>/success.jsp/*</url-pattern>
</filter-mapping>
LOGIN.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/21 0021
Time: 18:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 提交给login地址 但实际上login默认的前面有TomCat中的上级目录,所以需要加上 pageContext.request.contextPath-->
<form action="${pageContext.request.contextPath}/login" method="post" >
用户名: <input type="text" name="username" >
<input type="submit">
</form>
</body>
</html>
success.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/21 0021
Time: 17:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>登陆成功!</h1>
<a href="${pageContext.request.contextPath}/logout">注销</a>
</body>
</html>
error.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/21 0021
Time: 18:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<a href="${pageContext.request.contextPath}/LOGIN.jsp">返回登录页面</a>
</body>
</html>
Junit单元测试
package com.DYZ.jdbc;
import org.junit.Test; //需要导junit依赖
public class TestJdbc {
@Test
public void test(){
System.out.println("HELLO");
}
}
事务复习
package com.DYZ.jdbc;
import java.sql.*;
public class TestJdbc2 {
public static void main(String[] args) {
//配置信息
//解决中文乱码
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false";
String username="root";
String password="123456";
Connection connection=null;
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//连接数据库,代表数据库
connection= DriverManager.getConnection(url, username, password);
//关闭自动提交
connection.setAutoCommit(false);
//编写Sql 并向数据库发送Sql的对象PrepareStatement;
String sql="update jdbc.account set money=money-1000 where name='张宇'";
connection.prepareStatement(sql).executeUpdate();
String sql2="update jdbc.account set money=money+500 where name='王宇'";
connection.prepareStatement(sql2).executeUpdate();
String sql3="update jdbc.account set money=money+500 where name='黄宇'";
connection.prepareStatement(sql3).executeUpdate();
connection.commit();
if (connection!=null) {
connection.close();
}
} catch (ClassNotFoundException | SQLException e) {
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
SMBMS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvhndiIY-1659084486667)(D:\桌面\javaPicture\1647940540564.png)]
数据库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmlPQ0vr-1659084486667)(D:\桌面\javaPicture\1647940520172.png)]
项目搭建
-
搭建一个maven web项目
-
配置Tomcat
-
测试项目是否能够跑起来进入主页
-
导入项目中需要的jar包 jsp.servlet,mysql,jstl,standard
-
创建项目包结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdRkG4zL-1659084486668)(D:\桌面\javaPicture\1647940997090.png)]
-
编写实体类
ORM映射:表-类映射(根据数据库编写实体类(无参构造 有参构造 get set 方法))
编写基础公共类(公共类的方法一般写为静态方法 在别的类中可以用类名.方法名直接调用)
-
db.properties (数据库配置文件)
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8 username=root password=123456
-
编写数据库公共类
package com.DYZ.dao; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class BaseDao { static String url=null; static String driver=null; static String username=null; static String password=null; static { InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } url=properties.getProperty("url"); driver = properties.getProperty("driver"); username = properties.getProperty("username"); password = properties.getProperty("password"); } //获取数据库的连接 public static Connection getConnection(){ Connection connection=null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } //编写查询公共类 public static ResultSet execute(Connection connection , String sql, Object[] params,ResultSet resultSet, PreparedStatement preparedStatement)throws Exception { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } resultSet = preparedStatement.executeQuery(); return resultSet; } //编写增删改公共类 public static int execute(Connection connection , String sql, Object[] params, PreparedStatement preparedStatement)throws Exception { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i + 1, params[i]); } int updateRows= preparedStatement.executeUpdate(); return updateRows; } //释放资源 public static boolean closeResource(Connection connection ,PreparedStatement preparedStatement , ResultSet resultSet){ boolean flag=true; if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); flag = false; } } if (preparedStatement!=null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); flag = false; } } if (resultSet!=null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
-
编写字符编码过滤器
package com.DYZ.filter; import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf8"); servletResponse.setCharacterEncoding("utf8"); servletResponse.setContentType("text/html;charset=utf8"); filterChain.doFilter(servletRequest,servletResponse); } public void destroy() { } }
-
导入静态资源(webapp下)
-
设置首页
<!--这只欢迎界面(首页)--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
-
如果css不显示需要加一个样式过滤器
过滤代码:
package com.DYZ.filter; import javax.servlet.*; import java.io.IOException; public class CssEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletResponse.setContentType("text/css;charset=utf-8"); filterChain.doFilter(servletRequest,servletResponse); } public void destroy() { } }
web注册:
<!-- css过滤器 --> <filter> <filter-name>CssEncodingFilter</filter-name> <filter-class>com.DYZ.filter.CssEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CssEncodingFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping>
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiJJBdDd-1659084486668)(C:\Users\ADMINI~1\AppData\Local\Temp\1648294671042.png)]
- 编写Dao层接口并实现接口方法,获取登录用户的信息
package com.DYZ.dao.user; import com.DYZ.pojo.User; import java.sql.Connection; import java.util.Collection; public interface UserDao { /*得到登录的用户信息,只要在登录界面输入用户名, 即可得到该用户信息(所以该方法返回值为User类) */ public User getLoginUser(String userCode, Connection connection); }
package com.DYZ.dao.user; import com.DYZ.dao.BaseDao; import com.DYZ.pojo.User; import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Collection; public class UserDaoImpl implements UserDao{ public User getLoginUser(String userCode, Connection connection) { PreparedStatement pstm=null; ResultSet rs=null; User user=null; String sql="select * from smbms_user where userCode='userCode'"; String[] params={userCode}; try { if (connection!=null) { rs = BaseDao.execute(connection, sql, params, rs, pstm); while(rs.next()){ user = new User(); user.setId(rs.getInt("id")); user.setUserCode(rs.getString("userCode")); user.setUserName(rs.getString("userName")); user.setUserPassword(rs.getString("usePassword")); user.setGender(rs.getString("gender")); user.setBirthday(rs.getDate("birthday")); user.setPhone(rs.getString("phone")); user.setAddress(rs.getString("address")); user.setUserRole(rs.getInt("userRole")); user.setCreatedBy(rs.getInt("createBy")); user.setCreationDate(rs.getDate("creationDate")); user.setModifyBy(rs.getInt("modifyBy")); user.setModifyDate(rs.getDate("modifyDate")); } BaseDao.closeResource(null,pstm,rs); } } catch (Exception e) { e.printStackTrace(); } return user; } }
-
编写业务层接口并实现接口方法
package com.DYZ.service.user; import com.DYZ.pojo.User; public interface UserService { public User login(String userName , String passWord); }
package com.DYZ.service.user; import com.DYZ.dao.BaseDao; import com.DYZ.dao.user.UserDao; import com.DYZ.dao.user.UserDaoImpl; import com.DYZ.pojo.User; import org.junit.Test; import java.sql.Connection; public class UserServiceImpl implements UserService{ //业务层会用到Dao层,所以需要创建Dao层的实例化对象 UserDaoImpl userDao=null; public UserServiceImpl() { userDao = new UserDaoImpl(); } public User login(String userName, String passWord) { Connection connection = BaseDao.getConnection(); User loginUser = userDao.getLoginUser(userName, connection); BaseDao.closeResource(connection,null,null); return loginUser; } @Test public void Test(){ UserServiceImpl userService = new UserServiceImpl(); User admin = userService.login("admin", "123156");//此处密码无用 System.out.println(admin.getUserPassword()); } }
编写Servlet并注册
package com.DYZ.servlet.user; import com.DYZ.pojo.User; import com.DYZ.service.user.UserServiceImpl; import com.DYZ.util.Constants; 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 LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取前端用户输入的用户名和密码 String userCode = req.getParameter("userCode"); String userPassword = req.getParameter("userPassword"); //调用业务层判断用户名和密码是否匹配 UserServiceImpl userService = new UserServiceImpl(); User user = userService.login(userCode, userPassword); if (user!=null){ //用户名与密码匹配,能查到此人 //将查到的该用户信息存到从前端请求中得到的Session中 //Session的键为常量,可以存在常量文件中 req.getSession().setAttribute(Constants.User_Session,user); //跳转到主页 resp.sendRedirect("jsp/frame.jsp"); } else //查不到该人 { System.out.println("user为空"); //给前端请求中设置参数,前端读取${error}得到属性 req.setAttribute("error","用户名或密码不正确"); //转发回登录页面 req.getRequestDispatcher("login.jsp").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.DYZ.servlet.user.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
-
密码修改
UserDao接口及其实现方法
//修改密码(通过前端传来的唯一的id来判断修改密码的用户 因为人们可能会重复 )
public int UpdatePwd(Connection connection ,int id,String userPassword);
public int UpdatePwd(Connection connection,int id, String userPassword) {
PreparedStatement pstm=null;
int count=0;
if(connection!=null) { //业务层负责连接数据库 如果数据库没有连接就执行就会返回0个行数
System.out.println(userPassword);
String sql = "update smbms_user set usePassword=? where id=?";
Object[] params = {userPassword, id};
try {
count = BaseDao.execute(connection, sql, params, pstm);
System.out.println("count等于"+count);
} catch (Exception e) {
e.printStackTrace();
}finally {
//当时此处在调用execute之前使用导致connection和pstm关闭了 无法执行execute
BaseDao.closeResource(connection,pstm,null);
}
}
return count;
UserService接口及其实现方法
public boolean updatePwd(int id , String password);
public boolean updatePwd(int id, String password) {
boolean flag=false;
Connection connection = BaseDao.getConnection();
int i = userDao.UpdatePwd(connection, id, password);
System.out.println("i的值为"+i);//当时此处为0肯定为UpdatePwd方法执行出问题
if (i>0){
System.out.println("密码2"+password);//错误调试
flag=true;
}
BaseDao.closeResource(connection,null,null);
return flag;
}
updatePwdServlet
package com.DYZ.servlet.user;
import com.DYZ.pojo.User;
import com.DYZ.service.user.UserServiceImpl;
import com.DYZ.util.Constants;
import com.sun.org.apache.bcel.internal.generic.NEW;
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 updatePwdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Servlet复用
String method = req.getParameter("method");
System.out.println("method="+method);
if (method!=null&&method.equals("savepwd")){
System.out.println("进入updatePwd方法");
this.updatePwd(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
public void updatePwd(HttpServletRequest req, HttpServletResponse resp) {
Object attribute = req.getSession().getAttribute(Constants.User_Session);
String newpassword = req.getParameter("newpassword");
if (attribute != null && newpassword != null) {
System.out.println("第一个密码" + newpassword);
System.out.println(attribute != null);
UserServiceImpl userService = new UserServiceImpl();
Integer id = ((User) attribute).getId();
boolean b = userService.updatePwd(id, newpassword);
System.out.println("b的值为" + b);
if (b) {
System.out.println("进入重登界面");
//密码修改成功,退出使用新密码重新登陆
req.setAttribute("message", "密码修改成功,退出使用新密码重新登陆!");
req.getSession().removeAttribute(Constants.User_Session);
try {
req.getRequestDispatcher("/login.jsp").forward(req, resp);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
req.setAttribute("message", "密码修改失败");
}
} else {
req.setAttribute("message", "新密码有问题!");
}
}
//验证旧密码
public void pwdmodify(HttpServletRequest req , HttpServletResponse resp){
System.out.println("进去该方法");
Object attribute = req.getSession().getAttribute(User_Session);
String oldpassword = req.getParameter("oldpassword");
System.out.println(oldpassword);
HashMap<String, String> Map = new HashMap<String, String>();
//判断两个密码相同的前提1 取到了Session中的用户 即Session没过期
if (attribute==null){
System.out.println("用户信息过期");
Map.put("result","sessionerror");
}
//前提2 输入的旧密码不能为空
else if(StringUtils.isNullOrEmpty(oldpassword)){
System.out.println("旧密码为空");
Map.put("result","error");
}
//前提2 输入的旧密码正确
else if (oldpassword.equals(((User) attribute).getUserPassword())){
System.out.println("密码正确");
Map.put("result","true");
}
else{
System.out.println("密码不正确");
Map.put("result", "false");
}
try {
resp.setContentType("application/json");
PrintWriter writer = resp.getWriter();
writer.write(JSONArray.toJSONString(Map)); //将Map转换为Json键值对形式
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
$.ajax({
type:"GET",
url:path+"/jsp/user.do",
//Ajax传递的参数 method相当于在Pol.XML中注册了 因此pwdmodify方法中取到的前端参数一定是吃醋Ajax方法中的参数
data:{method:"pwdmodify",oldpassword:oldpassword.val()},
dataType:"json", //Ajax传递来的参数以json键值对的形式存储
servlet注册
<!--修改密码-->
<servlet>
<servlet-name>updatePwd</servlet-name>
<servlet-class>com.DYZ.servlet.user.updatePwdServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>updatePwd</servlet-name>
<url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
<!--设置会话时间为30分钟-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>