maven
创建一个maven项目的过程
1、在maven官网下载安装包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzwwfNnx-1635834582755)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031094059282.png)]
2、在D盘的environment目录下解压缩
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ud0mdrTi-1635834582758)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031090851978.png)]
(一开始是没有maven-repo文件夹的,是自己创建的,作为本地仓库)
3、新建一个文件夹用于作为本地仓库(存放一些常用架包)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OE1hlOTP-1635834582760)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031091704321.png)]
4、配置镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Uv7mUAy-1635834582762)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031091109421.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1De5ZbU-1635834582764)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031091434252.png)]
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- maven官方镜像 -->
<mirror>
<id>mirrorId</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name </name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 又一个镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://central.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- 阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- junit镜像地址 -->
<mirror>
<id>junit</id>
<name>junit Address/</name>
<url>http://jcenter.bintray.com/</url>
<mirrorOf>central</mirrorOf>
</mirror>
5、配置环境
电脑配置环境打开操作(win+R——control system——关于——高级系统设置——系统属性——环境变量)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfJXhNXJ-1635834582765)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031093046912.png)]
变量名:MAVEN_HOME
变量值:D:\environment\apache-maven-3.8.3-bin\apache-maven-3.8.3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Pht7l3d-1635834582766)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031093321045.png)]
添加环境变量:%MAVEN_HOME%\bin
6、查看maven是否配置成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBPKaUyu-1635834582766)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031093825154.png)]
7、打开IDEA,创建一个maven工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j9qaBSmB-1635834582768)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031095122038.png)]
8、输入配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZaihuZm-1635834582769)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031105402298.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIblhMOs-1635834582770)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031105222786.png)]
9、创建成功!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqqbVeLd-1635834582770)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031102004837.png)]
10、配置最新web.xml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLLNTkWR-1635834582771)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031102146286.png)]
<?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>
11、在pom.xml中导入需要的依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yxo9DIrA-1635834582772)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031105610165.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a48QCkbS-1635834582773)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031105641212.png)]
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--自动配置的GAV-->
<groupId>org.example</groupId>
<artifactId>maven7</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Package:项目的打包方式
java:java应用
war:JavaWeb应用-->
<packaging>war</packaging>
<name>maven7 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包-->
<!--Maven会帮忙导入这个jar包所依赖的其他jar-->
<!--下面是教程导入的依赖,在maven仓库可以查找到!-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
</dependency>
<!--jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependency>
</dependencies>
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
以上已完成基本创建操作
安装一些很棒的插件
- 翻译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIveSfQX-1635834582773)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031110039817.png)]
- 背景图片设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4tBKruDI-1635834582774)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031110111867.png)]
- 彩虹括号,方便代码查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4A4eZea-1635834582774)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031110236590.png)]
- 代码小地图,轻松上下翻
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXWyTiak-1635834582775)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031110319733.png)]
-
查看工作效果和时长等等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GDDgX3Mp-1635834582776)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031114158998.png)]
-
查看,统计代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IEktB6kv-1635834582776)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031114612806.png)]
- 代码补全ai
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhoiIOYI-1635834582777)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031114749472.png)]
- 对Mybatis的帮助
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SjbSRZjO-1635834582778)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031120507311.png)]
- 生成时序树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWY6sGvr-1635834582779)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031120533580.png)]
- 检查代码规范
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaopcGlR-1635834582780)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031120730472.png)]
帮助导入依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRFUG5H4-1635834582780)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031121013873.png)]
maven架包显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lBWWN0E-1635834582781)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031121400112.png)]
Servlet
1、Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供了一个接口:Servlet,如果要开发Servlet程序,只需要完成两个小步骤
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
把实现了Servlet接口的java程序,即Servlet
2、HelloServlet
Servlet接口有两个:HttpServlet和GenericServlet
1、构建一个普通的Maven项目(pom.xml是maven的核心)
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--自动配置的GAV-->
<groupId>org.example</groupId>
<artifactId>maven7</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Package:项目的打包方式
java:java应用
war:JavaWeb应用-->
<packaging>war</packaging>
<name>maven7 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包-->
<!--Maven会帮忙导入这个jar包所依赖的其他jar-->
<!--下面是教程导入的依赖,在maven仓库可以查找到!-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependency>
</dependencies>
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
2、关于Maven父子工程的理解
父项目中会有
<modules>
<module>servlet-01</module>
</modules>
子项目中会有
<parent>
<artifactId>maven-01</artifactId>
<groupId>com.wu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的java子项目可以使用
son extends father
3、Maven环境优化
1、修改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>
2、将maven的结构搭建完成;
3、没有web.iml文件
在Terminal输入:mvn idea:module
4、编写一个Servlet程序
1、编写一个普通类
2、实现Servlet接口
public class HelloServlet extends HttpServlet{
//由于get和post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
PrintWriter writer = resp.getWriter();
writer.println("Hello,World!")
}
}
5、编写Servlet的映射
为什么需要映射!我们写的java程序,要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要web服务中注册我们写的Servlet,还需要给他一个能够访问的路径。在web.xml中修改
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wu.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6、配置Tomcat
注意:配置项目发布的路径就可以了
7、启动测试
3、Servlet原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxWr7qUQ-1635834582782)(C:\Users\28164\Pictures\Screenshots\屏幕截图(10)].png)
4、Mapping问题
1.一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.默认请求路径
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5.指定后缀或者前缀等
<!--可以自定义后缀实现请求路径
*前面不能加项目映射路径(/)-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.xiaowu</url-pattern>
</servlet-mapping>
6.优先级问题
指定了固有的映射路径的优先级最高,如果找不到就走默认的处理请求
<!--404处理-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.wu.servlet.errorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5、ServletContent
1、数据共享
public class SetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// content.getInitParameter();初始化参数
// this.getServletConfig();Servlet配置
// this.getServletContext();Servlet上下文
ServletContext context = this.getServletContext();
String username = "小米";
context.setAttribute("username",username);
System.out.println("放置");
}
}
public class GetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.getWriter().print(username);
System.out.println("得到!");
}
}
2、资源配置
//获取初始化配置的信息
public class InitServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
}
<!--配置web初始化文件-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>Init</servlet-name>
<servlet-class>com.wu.servlet.InitServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Init</servlet-name>
<url-pattern>/Init</url-pattern>
</servlet-mapping>
3、请求转发
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
ServletContext context = this.getServletContext();
resp.getWriter().print("转化成功!");
}
}
<servlet>
<servlet-name>Dis</servlet-name>
<servlet-class>com.wu.servlet.DispartcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Dis</servlet-name>
<url-pattern>/dis</url-pattern>
</servlet-mapping>
</web-app>
4、读取资源文件
Properties
- 在Java目录下新建properties
- 在resources目录下新建properties
都被打包到相同路径:classes,类路径
public class PropertiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(input);
String name = properties.getProperty("username");
String pwd = properties.getProperty("password");
resp.getWriter().print(name+pwd);
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
}
}
<servlet>
<servlet-name>pro</servlet-name>
<servlet-class>com.wu.servlet.PropertiesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pro</servlet-name>
<url-pattern>/pro</url-pattern>
</servlet-mapping>
username = 小吴
password = 1234567890
6、HttpServletResponse
web服务器接收客户端的http请求,针对这个请求,分别创建一个代表的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的一些参数:使用HttpServletRequest
- 如果要给客户端响应一些信息:使用HttpServletRequest
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbepGSWH-1635834582783)(C:\Users\28164\Pictures\resp.png)]
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throw IOException;
PrintWriter getWriter() threws IOException;
负责向浏览器发送响应头的方法
String getCharacterEncoding();
String getContentType();
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setBufferSize(int var1);
int getBufferSize();
void flushBuffer() throws IOException;
void resetBuffer();
boolean isCommitted();
void reset();
void setLocale(Locale var1);
Locale getLocale();
响应的状态码:
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
常见应用
1、向浏览器输出信息
2、下载文件
2、下载文件
public class DownServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = "D:\\maven-01\\servlet-02\\target\\classes\\1.PNG";
String fileName = path.substring(path.lastIndexOf("\\")+1);
resp.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
FileInputStream fis = new FileInputStream(path);
int len = 0;
byte[] data = new byte[1024];
ServletOutputStream os = resp.getOutputStream();
while ((len=fis.read(data))>0){
os.write(data,0,len);
}
fis.close();
os.close();
}
}
3、生成验证码
public class imageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒自动刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D) image.getGraphics();//笔
//设置图片的背景颜色
g.setColor(Color.white);
g.fillRect(0,0,100,30);
//给图片写数据
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("Pragma","no-cache");
//将图片在浏览器画出来
ImageIO.write(image,"jpg",resp.getOutputStream());
}
<!--产生随机数-->
private String makeNum(){
Random rand = new Random();
String num = rand.nextInt(1000000)+"";
StringBuffer buf = new StringBuffer();
for(int i = 0;i < 7-num.length();i++){
buf.append("0");
}
num = buf.toString()+num;
return num;
}
}
4、实现重定向
A访问B B告诉A重新访问C A再访问C
面试题:重定向和请求转发有的区别
相同点
- 页面会实现跳转
不同点
- 请求转发的时候,url不会产生变化 307
- 重定向时,url会发生变化 302
public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+"<br>"+password);
//重定向时要注意路径,否则报错404
resp.sendRedirect("/s2/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前的项目--%>
<form method="get" action="${pageContext.request.contextPath}/req">
用户名:<input type="text" name="username" ><br>
密码:<input type="password" name="password"><br>
<input type="submit" >
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 28164
Date: 2021/10/27
Time: 18:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录测试成功!</title>
</head>
<body>
<p size="40" align="center">登录测试成功!</p>
</body>
</html>
<servlet>
<servlet-name>req</servlet-name>
<servlet-class>com.wu.servlet.RequestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>req</servlet-name>
<url-pattern>/req</url-pattern>
</servlet-mapping>
7、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest的方法,获取客户端的全部信息。
1、获取前端页面的数据
8、Cookie和Session
会话:用户打开一个浏览器,点击了许多连接,访问多个web资源,关闭浏览器,这个过程就是会话
有状态会话:
客户端 服务端
1、服务器给客户端一个 信件 客户端下次访问服务端时带上信件即可;cookie
2、服务器登记你来过了,下次你来得时候服务端来匹配你;session
1、保存会话的两种方式
cookie
- 客户端技术(响应)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息~我们可以把信息或者数据放到Session中。
常见:网站登录之后,第二次就不用再登录,第二次访问直接就上去了
2、Cookie
服务器端像客户端发送Cookie是通过HTTP响应报文实现的,在Set-Cookie中设置需要像客户端发送的cookie,cookie格式如下:
Set-Cookie: “name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure”
其中name=value是必选项,其它都是可选项。Cookie的主要构成如下:
name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。
value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码
domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).
path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。
expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除,
expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。
HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置
1、从服务器拿到cookie信息
2、服务器响应到客户端cookie
Cookie[] cookies = req.getCookies();// Cookie,服务器从客户端获取可能存在多个Cookie
cookies.getName();//获取cookie中的key
cookies.getValue();//获取cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下的appdate
C:\Users\28164\AppData\LocalLow
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3SJGV5I-1635834582783)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211028095503419.png)]
一个网站cookie是否存在上限!
- 一个Cookie只能保存一个信息
- 一个web站点(客户端)可以给浏览器(载体)发送多个cookie,最多存放20个
- 300个cookie浏览器上限
- Cookie大小有限制4kb
删除Cookie:
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效时间为 0;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务器告诉你来的时间,把这个时间封装成为一个信件,下次访问时携带此信息,服务器知道你来了
// 解决乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
PrintWriter out = resp.getWriter();
// Cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//返回数组,可能存在多个Cookie
// 判断Cookies是否存在
if(cookies!=null){
// 存在
out.write("上次访问的时间:");
for(int i = 0;i<cookies.length;i++){
Cookie cookie = cookies[i];
// 获取cookie的名字
if(cookie.getName().equals("lastTime")){
// 获取cookie的值
long lastTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastTime);
out.write(date.toLocaleString());
}
}
}else {
out.print("第一次访问!");
}
// 服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastTime",System.currentTimeMillis()+"");
// cookie有效期为20s
cookie.setMaxAge(1*5*60);
resp.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建一个Cookie,名字和删除的Cookie的name一致
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
// 将Cookie的有效期设置为10s
cookie.setMaxAge(1*1*10);
// 将cookie响应给客户端
resp.addCookie(cookie);
}
<!--设置cookies有效时长-->
<session-config>
<cookie-config>
<!--以分钟计-->
<max-age>1</max-age>
</cookie-config>
</session-config>
3、Session(重点)
什么是Session
- 服务器会给每个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。
Session和Cookie的1区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以多个)
- Session是把用户数据写到用户独占Session,服务器端保存(保存重要信息,减少服务器资源的浪费)
- Session由服务器产生
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//预防出现乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("utf-8");
//得到一个Session
HttpSession session = req.getSession();
//在Session中存放对象
session.setAttribute("person",new Person("小五",19,1001));
//获取Session中的内容
String str = (String) session.getAttribute("Person");
//打印Session
System.out.println(str);
//获取时间函数
Date date = new Date();
//获取session最后一次交互时间
Date date1 = new Date(session.getLastAccessedTime());
//判断是不是新创建的Session
if(session.isNew()){
resp.getWriter().write("Session创建成功!id:"+session.getId());
}else{
resp.getWriter().write("session创建时间为:"+date1);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
//获得Session
HttpSession session = req.getSession();
//获取Session中的person
Person person = (Person) session.getAttribute("person");
System.out.println(person.toString());
//显示获取到的信息
resp.getWriter().write(person.toString());
resp.getWriter().write(session.getId());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
//移除person
session.removeAttribute("person");
//手动注销Session
session.invalidate();
}
}
public class Person {
String name;
int age;
int id;
public Person(String name, int age, int id) {
this.name = name;
this.age = age;
this.id = id;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
9、JSP
1、什么是JSP
Java Server Page:java服务端页面,也和Servlet一样,用于动态Web技术
-
最大的特点:
-
写JSP就像在写HTML
-
区别
- HTML只给用户提供静态的数据
- jsp页面中可以嵌入Java代码,为用户提供动态数据
2、JSP原理
-
代码层面看不难
-
Tomcat服务器内部工作原理
- tomcat目录中由一个work目录
- idea中使用Tomcat会在idea的Tomcat中产生一个work目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoe913uS-1635834582784)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211030223318518.png)]
路径:C:\Users\28164\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat
页面转变成了java程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OigupptH-1635834582785)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211030225320848.png)]
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换成一个java类!
JSP本质就是一个Servlet
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
1、判断请求
2、设置内置对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文
javax.servlet.http.HttpSession session = null;//session
final javax.servlet.ServletContext application;//ServletContext
final javax.servlet.ServletConfig config;//配置文件
javax.servlet.jsp.JspWriter out = null;//页面输出
final java.lang.Object page = this;//当前页面
final javax.servlet.http.HttpServletRequest request;//请求
final javax.servlet.http.HttpServletResponse response;//响应
3、输出页面前增加的代码
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
4、以上这些对象我们可在jsp页面中直接使用。
在jsp页面中
只有是java代码就会原封不动的输出
如果是HTML,就会被转化为
out.write("<html>\r\n");
以此种方式,输出到前端
3、jsp基础语法
任何语言都有自己的语法
jsp作为java技术的一种应用,它拥有自己的扩展,但java的所有语法都支持
1、JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%变量或者表达式%>--%>
<%= new java.util.Date()%>
2、脚本片段
<%
String str = "Hello World!";
out.println("<h1>输出:"+str+"</h1>");
%>
3、脚本再嵌入
<%
for (int i = 0; i <3;i++){
%>
<h2>你好,我的小楠,爱你</h2>
<%}%>
4、JSP声明
//全局变量
<%!
String name = "小吴";
int id = 007;
%>
<%
out.println("name:"+name);
out.println("id:"+id);
%>
<!--html注释-->//会在客户端源代码显示
<%--jsp注释--%>//不会在客户端源代码显示
5、定制错误页面
<!--新建的404.jsp-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page errorPage="404.jsp" %>
<%--显示声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
<title>404错误</title>
</head>
<body>
<img src="../img/404.jpg" alt="404错误图片">
</body>
</html>
<!--在web.xml中配置-->
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<!--新建的500.jsp-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制500u错误页面--%>
<%@page errorPage="500.jsp" %>
<%@page isErrorPage="true" %>
<html>
<head>
<title>500错误</title>
</head>
<body>
<img src="../img/500.jpg" alt="500错误图片">
</body>
</html>
<!--web.xml中配置-->
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
6、页面的公用部分添加
<!--在web下新建一个common目录存放-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>头部页面</title>
</head>
<body>
<h>这是头部</h>
</body>
</html>
<!--存放在common目录-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>底部文件</title>
</head>
<body>
<h>这是底部</h>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试include</title>
</head>
<body>
<%--合二为一--%>
<%@include file="/common/header.jsp"%>
<h1>这是主体1!</h1>
<%@include file="/common/footer.jsp"%>
<hr>
<%--拼接而成,较好--%>
<jsp:include page="/common/header.jsp"/>
<h1>这是主体2!</h1>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
- 前者源码
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>头部页面</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h>这是头部</h>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");
out.write("<h1>这是主体1!</h1>\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>底部文件</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h>这是底部</h>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");
后者源码
static {
_jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(2);
_jspx_dependants.put("/common/header.jsp", Long.valueOf(1635616124279L));
_jspx_dependants.put("/common/footer.jsp", Long.valueOf(1635616124287L));
}
out.write("</html>\r\n");
out.write("\r\n");
out.write("<hr>\r\n");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/header.jsp", out, false);
out.write("\r\n");
out.write("<h1>这是主体2!</h1>\r\n");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/footer.jsp", out, false);
out.write("\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
前者如果在header.jsp或footer.jsp中添加了<% int a = 10%>,再往header-footer.jsp中添加<% int a = 0%>,此时会报500错误,因为在一个java类里不能定义两个相同变量,后者则不会出错,因为它仅仅是引用,此时是以主体的变量为主。
4、JSP内置对象及其作用域
- pageContent 存放数据
- respone
- request 存放数据
- Session 存放数据
- Applocation【ServletContext】 存放数据
- config【ServletConfig】 存放数据
- out
- page
- exception
public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
public static final String PAGE = "javax.servlet.jsp.jspPage";
public static final String PAGECONTEXT = "javax.servlet.jsp.jspPageContext";
public static final String REQUEST = "javax.servlet.jsp.jspRequest";
public static final String RESPONSE = "javax.servlet.jsp.jspResponse";
public static final String CONFIG = "javax.servlet.jsp.jspConfig";
public static final String SESSION = "javax.servlet.jsp.jspSession";
public static final String OUT = "javax.servlet.jsp.jspOut";
public static final String APPLICATION = "javax.servlet.jsp.jspApplication";
public static final String EXCEPTION = "javax.servlet.jsp.jspException";
public void setAttribute(String name, Object attribute, int scope) {
switch(scope) {
case 1:
this.mPage.put(name, attribute);
break;
case 2:
this.mRequest.put(name, attribute);
break;
case 3:
this.mSession.put(name, attribute);
break;
case 4:
this.mApp.put(name, attribute);
break;
default:
throw new IllegalArgumentException("Bad scope " + scope);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>内置对象</title>
</head>
<body>
<%-- public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
public void setAttribute(String name, Object attribute, int scope) {
switch(scope) {
case 1:
this.mPage.put(name, attribute);
break;
case 2:
this.mRequest.put(name, attribute);
break;
case 3:
this.mSession.put(name, attribute);
break;
case 4:
this.mApp.put(name, attribute);
break;
default:
throw new IllegalArgumentException("Bad scope " + scope);
}--%>
<%
//保存的数据只在一个页面中有效
pageContext.setAttribute("name1","小吴01");
//保存的数据只在一次请求中有效,请求转发会携带这个数据
request.setAttribute("name2","小吴02");
//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name3","小吴03");
//保存的数据只在服务器中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","小吴04");
//手动设置范围,作用域
pageContext.setAttribute("id",12,pageContext.SESSION_SCOPE);
%>
<%--脚本里面的代码会原封不动生成到xxx_jsp.java
要求:<%%>里面的代码必须符合java语法的正确性--%>
<%
//通过pageContext寻找取出 pageContext->request->session->application 范围逐渐扩大 双亲委派机制
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出 ${}}--%>
<h> ${name1}
${name2}
${name3}
${name4}
<%=name5%>
</h>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 28164
Date: 2021/10/31
Time: 13:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>取值</title>
</head>
<body>
<h> ${name1}
${name2}
${name3}
${name4}
${id}
</h>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: wu
Date: 2021/10/31
Time: 14:38
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.forward("/index.jsp");
//request.getRequestDispatcher("/index.jsp").forward(request,response);
%>
</body>
</html>
5、JSP标签、JSTL标签和EL表达式
EL表达式 ${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl</title>
</head>
<body>
<jsp:forward page="jsptag02.jsp">
<jsp:param name="name" value="tita"></jsp:param>
<jsp:param name="id" value='123'></jsp:param>
</jsp:forward>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
name:<%=request.getParameter("name")%>
id:<%=request.getParameter("id")%>
</body>
</html>
JSTL标签
JSTL标签库的使用就是为了弥补HTML标签的不足,有许多自定义的标签!
核心标签()
格式化标签
SQL标签
XML标签
JSTL标签库使用步骤
- 引入对应的taglib
- 使用其中的方法
- 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
JSTL自己去看菜鸟教程或W3school
10、JavaBean
实体类
JavaBean有特定的写法:
-
必须要有一个无参构造
-
属性必须私有化
-
必须有对应的get/set方法
一般用来和数据库的字段做映射:ORM(Object Relation Mapping)对象关系映射
-
表——类
-
字段——属性
-
行记录——对象
people表
id | name | age | address |
---|---|---|---|
1 | 吴1 | 10 | 揭阳 |
2 | 吴2 | 11 | 上海 |
3 | 吴3 | 12 | 北京 |
class people{
int id,age;
String name,address;
}
代表实体类:
pojo(plain ordinary java object)= entity =dto(data transmission object)
/**
* @author wu
*/
public class People {
private int id,age;
private String name,address;
public People() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
<%--
Created by IntelliJ IDEA.
User: 28164
Date: 2021/11/1
Time: 19:14
To change this template use File | Settings | File Templates.
--%>
<%@page import="com.wu.pojo.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<%
// People people = new People();
// people.setname("吴五");
// people.setaddress("揭阳");
// people.setid(007);
// people.setage(10);
%>
<jsp:useBean id="people" class="com.wu.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="广州"/>
<jsp:setProperty name="people" property="id" value="008"/>
<jsp:setProperty name="people" property="name" value="小吴"/>
<jsp:setProperty name="people" property="age" value="20"/>
<jsp:getProperty name="people" property="name"/>
<jsp:getProperty name="people" property="address"/>
<jsp:getProperty name="people" property="id"/>
<jsp:getProperty name="people" property="age"/>
</body>
</html>
11、MVC三层架构
什么是MVC:Model(模型) view(视图) Controller(控制器)
![(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031170729884.png)
用户直接访问控制层,控制层就可以直接操作数据库
servlet--CRUD--
数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDSC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的
|
JDBC
|
Mysql、SQLserver、Oracle
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dA271PNa-1635834582786)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031175123513.png)]
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(create 添加数据read读取数据 update 修改数据delete删除数据) (DAO)
(data access Object)
View
- 展示数据
- 提供链接发起Servlet请求(a,form,img)
Controller (Servlet)
-
接受用户的请求参数:(req:请求参数、Session信息)
-
交给业务层处理对应得代码
-
控制视图的跳转
登录---->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)---->交给业务层处理登录业务(判断用户名密码是否正确:事务)---->Dao层查询用户名和密码是否正确--->数据库
12、Filter(重点 )
Filter:过滤器,用来过滤网站的数据
- 处理中文乱码
- 登录验证
流程:
1、导包不要出错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdDfaEwf-1635834582786)(C:\Users\28164\Pictures\屏幕截图(16)]_LI.jpg)
2、实现Filter接口,重写三个方法
package com.wu.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* The type Character encoding filter.
*
* @author wu
*/
public class CharacterEncodingFilter implements Filter {
@Override
/**
1、初始化
* */
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
/**
1、过滤中的所有代码,都过滤特定请求的时候都会执行
2、必须让过滤器继续同行
**/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
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("过滤器销毁");
}
}
3、配置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">
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.wu.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.wu.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只要是Servlet的任何请求都会经过这个过滤器,尽量不要这样-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
13、监听器
1、编写一个监听器
实现监听器的接口,重写里面的方法
package com.wu.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* The type Character encoding filter.
*
* @author wu
*/
public class CharacterEncodingFilter implements Filter {
@Override
/**
1、初始化
* */
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
/**
1、过滤中的所有代码,都过滤特定请求的时候都会执行
2、必须让过滤器继续同行
**/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
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("过滤器销毁");
}
}
2、在web.xml中注册监听器
Http
1、http请求
lastTime=1635580549518; Max-Age=300; Expires=Sat, 30-Oct-2021 08:00:49 GMT
lastTime=1635580549518; Max-Age=300; Expires=Sat, 30-Oct-2021 08:00:49 GMT
2、http响应
-
服务器——响应——客户端
百度
Cache-Control:private 缓存控制 Connection:keep-Alive 连接 Content-Encoding:gzip 编码 Content-Type:text/html 类型
响应体
Accept:告诉浏览器,它所支持的数据类型 Accept-Encoding:支持哪种编码方式:GBK,utf-8 GB2312 Accept-Language:告诉浏览器,它的语言环境 cache-Control:缓存控制 Connection:告诉浏览器,请求完成后是断开还是保持连接 HOST:主机... Refresh:告诉客户端,多久刷新一次 Location:让网页重定向
什么是HTTP响应
当服务器收到浏览器的请求后,会发送响应消息给浏览器。一个完整的响应消息主要包括响应首行、响应头信息、空行和响应正文。HTTP响应消息分析
HTTP/1.1 200 OKServer: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 624
Date: Mon, 03 Nov 2014 06:37:28 GMT
响应体内容
(1)响应首行:其内容是”HTTP/1.1 200 OK”
l HTTP/1.1 :表示协议版本
l 200 :表示响应状态码,200表示响应成功。
l OK :表示响应成功,对响应状态码的解释。
(2)响应头信息:类似于请求消息中的请求头,其格式和请求头信息格式一样,即响应头:响应头值。
l Server响应头:该响应头是服务器告诉浏览器,当前响应的服务类型和版本。
l Content-Type响应头:服务器告诉浏览器响应内容是什么类型,以及采用的是什么字符编码。该响应头的值现在为:text/html;charset=utf-8。说明响应信息的类型是文本类型中的html,使用的字符编码是utf-8。
l Content-Length响应头:服务器告诉浏览器,响应内容的长度,该响应内容的长度现在是624个字节。
l Date响应头:表示是服务器是在什么时候响应回浏览器,注意这里的时间是按照美国时间来计算。
(3)空行:响应头和响应体由空行连接。
(4)响应体:该响应消息的响应体是一个html文档。浏览器可以直接识别这个html文件。而我们访问的是一个jsp文件,响应回去的是一个html文件。说明服务器将该jsp翻译成了一个html,然后再响应给浏览器。
响应状态码
在http响应协议中,我们通过HttpWatch抓包抓取到响应信息。其中响应首行中就包含一个状态码。状态码由三位数字组成,表示请求是否被理解或者被满足。HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体分类,第一个数字有五种可能的取值,具体介绍如下所示:l 1xx :表示请求已接收,需要继续处理。
l 2xx :表示请求已经成功被服务器接收、理解、并接受
l 3xx :为完成请求,客户端需要进一步细化请求
l 4xx :客户端的请求有错误
l 5xx :服务器端出现错误
!出现的问题及解决方法:
报错405
servlet提交表单,结果出错。
出现HTTP Status 405 - HTTP method GET is not supported by this URL 原因是:
1、继承自Httpservlet的Servlet没有重写对于请求和响应的处理方法:doGet或doPost等方法,默认调用父类的doGet或doPost等方法。
2、父类HttpServlet的doGet或doPost等方法覆盖了你写的到doGet或doPost等方法。
不管是1或2,父类HttpServlet的doGet或doPost等方法默认实现是返回状态码是405的Http错误表示 对于指定资源请求方法不被允许。
解决方法:
1、子类重写doGet或doPost等方法。
2、在你扩张的Servlet中重写doGet或doPost等方法来处理请求和响应时,不要调用父类的doGet或doPost等方法即去掉supper.doGet(request,response)和super.doPost(request,response);
报错404
Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
置的 Sources 和 Dependencies 里边都是jdk 1.8的。
根据以上错误显示以及上述配置,我选择的编译器是jdk1.8的,但是在idea里边选择的编译版本是不一致的,所以会导致以上问题,
解决问题: 配置idea的编译版本
file -> settings 然后如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HZIknI8-1635834582787)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211026110731156.png)]
pom.xml文件灰色且出现中间出现删除线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChY9qYbr-1635834582788)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211026111054340.png)]
没有web.xml文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yvuvO7HC-1635834582789)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211026111239104.png)]
修改maven默认配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5T5YQhdo-1635834582790)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211026111715691.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV4xd4Y1-1635834582791)(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211026111833332.png)]
子模块无法继承父项目依赖
子模块继承父模块依赖的方法全部报错
<parent>
<artifactId>maven-01</artifactId>
<groupId>com.wu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
maven的pom.XML
<dependencies>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--JSP依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--JSTL表达式依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
最新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>