JavaWeb笔记
JavaWeb笔记
1、HelloServlet
-
Servlet就是sun公司开发动态web的技术
-
sun在这些APi中提供一个接口:Servlet
-
编写一个类,实现Servlet接口
-
开发好的java类部署到web服务器
-
把实现Servlet接口的java程序叫做Servlet
- idea部分快捷键
ctrl+shift+alt:多行操作
psvm:生成main()方法;
fori:生成for循环;
Ctrl+Alt+v:自动补齐返回值类型
ctrl+o:覆写方法
ctrl+i:实现接口中的方法
ctrl+shift+u:大小写转换
CTRL+SHIFT+Z:取消撤销
Alt+Insert:生成构造方法、getter、setter
ctrl+y:删除当前行
Ctrl+Shift+J:将选中的行合并成一行
ctrl+g:定位到某一行
Ctrl+Shitft+向下箭头:将光标所在的代码块向下整体移动
Ctrl+Shift+向上箭头:将光标所在的代码块向上整体移动
Alt+Shift+向下箭头:将行向下移动
Alt+Shift+向上箭头:将行向上移动
Ctrl+F:在当前文件中查找
Ctrl+R:替换字符串
Ctrl+Shift+F:在全局文件中查找字符串
Ctrl+Shift+R:在全局中替换字符串
Ctrl+Shift+Enter:自动补齐{}或者分号;
Shift+Enter:在当前行的下方开始新行
Ctrl+Alt+Enter:在当前行的上方插入新行
Ctrl+Delete:删除光标所在至单词结尾处的所有字符
ctrl+鼠标左键 查看该类的方法
1.1 HelloServlet
- 构建maven项目
- 导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 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>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
- 解决maven资源导包问题
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
- 创建一个javawebServlet-01-helloServlet模块,使其变为web项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X3szlguM-1635061152611)(image-20211020211504109.png)]
- 编写Servlet类
public class HelloServlet extends HttpServlet {
//由于get和post只是请求实现方式不同,可以相互调用,业务逻辑相同
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer= resp.getWriter();//响应流
writer.print("HelloServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 编写Servlet映射(web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wang.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
- 配置Tomcat
用Tomcat9
注意尽量使用Tomcat9,用10的话容易出现导包问题
- 启动测试
1.2 Servlet运行原理
1.3 Mapping
- 一个Servlet可以指定多个映射路径
<!--Servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
可以使用通配符 *
-
可以自定义后缀
<!--指定后缀,如果是下面这种类型不能加/-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- 优先级
如果指定了固有的路径优先级最高
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--指定后缀,如果是下面这种类型不能加/-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
对比一下,运行的时候我们输入hello,到底走HelloServlet还是ErrorServlet
测试后发现,我们走的是HelloServlet
可以对比发现,固有的路径优先级高
2、ServletContext
web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,他代表当前的web应用
2.1 共享数据
在这个servlet保存的数据,可以在另一个Servlet使用
在HelloServlet类中(放置数据)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
//获取ServletContext对象
ServletContext context=this.getServletContext();
String username="wang";
//将username以键值对的形式放入ServletContext
context.setAttribute("username",username);
}
}
在GetUsername类(获取数据)
public class GetUsername extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context=this.getServletContext();
//ServletContext本身是object类型,由于获取的对象是String类型,所以我们需要强转
String username=(String) context.getAttribute("username");
resp.getWriter().print(username);
}
}
不要忘了注册servlet
我们发现运行HelloServlet后,再次运行Getusername,数据就实现了共享
可见ServletContext在我们所有Servlet类之上
2.2 获取初始化参数
web.xml
<!--设置初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>www.baidu.com</param-value>
</context-param>
在web.xml中配置好我们的初始化参数
编写一个Servlet类(GetParam)
public class GetParam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context=this.getServletContext();
//括号里的url使我们设置初始化数据的名字
String url=context.getInitParameter("url");
resp.getWriter().print(url);
}
}
记得注册Servlet
我们获取到的初始参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmQPa6Wz-1635061152615)(image-20211021144601612.png)]
2.3 请求转发
将我们一个Servlet的数据转发到另一个Servlet
编写一个Servlet(ReGet)
public class Reget extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context=this.getServletContext();
//设置请求转发的路径(Servlet路径,将getParam的数据转发到reGet)
RequestDispatcher dispatcher= context.getRequestDispatcher("/getParam");
//设置请求转发
dispatcher.forward(req,resp);
}
}
记得注册
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUSAvlnT-1635061152617)(image-20211021150536392.png)]
2.4 读取资源文件
编写servlet(Getpop)
public class Getpop extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context=this.getServletContext();
//相对路径(使用我们生成的项目的路径,就是target包)
InputStream in=context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties pop=new Properties();
pop.load(in);
String user=pop.getProperty("username");//以键值对获取
String pwd=pop.getProperty("password");
resp.getWriter().print(user+pwd);
}
}
在resource目录下编写db.properties
username=root
password=123456
注册servlet
运行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6wwYKF5-1635061152619)(image-20211021175218830.png)]
3、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建了一个代表请求的HttpServletRequest和和代表响应的HttpServletResponse
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应信息:找HttpServletResponse
3.1 方法分类
- 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;//流
PrintWriter getWriter() throws IOException;//可以发送中文
- 负责向浏览器发送设置响应头的方法
//设置编码
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
//设置网页的形式(可以是html或者imge等)
void setContentType(String var1);
void setBufferSize(int var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
//这个方法比较重点
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
void setStatus(int var1);
- 响应的状态码
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;
200:请求成功
3xx:请求重定向
4xx:找不到资源
5xx:服务器端代码错误
502:网关错误
3.2 常见应用(下载)
- 向浏览器输出消息
PrintWriter writer= resp.getWriter();
-
下载文件
1、要获取下载文件路径
2、下载的文件名
3、设置让浏览器支持下载我们需要下载的东西
4、获取下载文件的输入流
5、创建缓冲区
6、获取OutputStream对象
7、将FileOutputStream流写入缓冲区
8、使用Outputstream将缓冲区的数据输出到客户端
public class FileDown extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//1、要获取下载文件路径
String file="G:\\IDEA\\workspace\\JavaWeb\\servlet-03-response\\src\\main\\resources\\1.png";
//2、下载的文件名
String filename=file.substring(file.lastIndexOf("\\")+1);
//3、设置让浏览器支持下载我们需要下载的东西
resp.setHeader("Content-disposition","attachment;filename"+URLEncoder.encode(filename,"UTF-8"));
//4、获取下载文件的输入流
FileInputStream in=new FileInputStream(file);
//5、创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
//6、获取OutputStream对象
ServletOutputStream out=resp.getOutputStream();
//7、将FileOutputStream流写入缓冲区 8、使用Outputstream将缓冲区的数据输出到客户端
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
//9、关闭
in.close();
out.close();
}
}
3.3 验证码
主要就是让浏览器自动刷新
public class VerificationCode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//浏览器5秒刷新一次
resp.setHeader("refresh","5");
//设置向浏览器响应的文件类型(文本类型)
resp.setContentType("text/html");
//浏览器有缓存,设置没有缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//输出
PrintWriter writer=resp.getWriter();
writer.print(getNum());
}
//生成随机数
private int getNum(){
Random random=new Random();
int num=random.nextInt(9999999);//7位数
return num;
}
}
3.4 重定向
一个web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程就叫重定向
-
常见场景
用户登录
sendRedirect这个方法实现重定向
void sendRedirect(String var1) throws IOException;
public class Redirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//跳转到getCode 一定要注意路径问题
resp.sendRedirect("/s3/getCode");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
重定向和请求转发的区别
1、请求转发时,url不会变化 状态码 307
2、重定向时,url会变化 状态码 302
4、HttpServletRequest
获取客户端的信息
4.1 获取前端传递的参数
String getParameter(String var1);
Enumeration<String> getParameterNames();
String[] getParameterValues(String var1);
Map<String, String[]> getParameterMap();
- 我们先编写index.jsp
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1 style="text-align: center">登录</h1>
<%--以post方式传递表单--%>
<form style="text-align: center" action="${pageContext.request.contextPath}/login" method="post">
名字:<input type="text" name="username"><br>
密码:<input type="password" name="pwd"><br>
爱好:<input type="checkbox" name="hobbys" value="1">1
<input type="checkbox" name="hobbys" value="2">2
<input type="checkbox" name="hobbys" value="3">3
<input type="checkbox" name="hobbys" value="4">4
<input type="checkbox" name="hobbys" value="5">5
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
- servlet类(Login)
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String pwd=req.getParameter("pwd");
//以数组形式获取表单信息
String hobbys[]=req.getParameterValues("hobbys");
System.out.println(username+","+pwd);
for(String hobby: hobbys){
System.out.println(hobby);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.2 请求转发
- 在4.1基础上我们添加一个success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
- 在我们的Login类中的doGet方法添加
//请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
注意请求转发的路径,与重定向不同
自行测试
5、Cookie、Session
5.1 会话
会话:用户打开一个浏览器,点击很多超链接,访问web资源,关闭浏览器,这个过程就是会话
保存会话的两种技术cookie和session
cookie
- 客户端技术(响应、请求)
session
-
服务器技术,可以保存用户的会话信息。我们可以将会话信息存放在session中
-
常见用处:网站登录之后,下次不需要输入账号和密码就能登录
5.2 Cookie
主要的几个方法
//创造一个cookie
new Cookie();
//设置cookie存在周期
cookie.setMaxAge();
//给浏览器响应一个cookie
resp.addCookie(cookie);
//获取cookie的键(key ---》 name)
cookie.getName();
//获取cookie的值(value)
cookie.getValue()
- 看测试
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
//new一个cookie System.currentTimeMillis()获取当前时间
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
//给cookie设置存在时间(一天)
cookie.setMaxAge(24*60*60);
//给浏览器响应一个cookie
resp.addCookie(cookie);
//在从浏览器获取cookie
Cookie[] cookies = req.getCookies();
//将cookie输出到浏览器
for (Cookie cookie1:cookies){
if(cookie1.getName().equals("LastLoginTime")){
//一系列转化 最后转化为时间
long l = Long.parseLong(cookie1.getValue());
Date date = new Date(l);
writer.write(date.toLocaleString());
}
}
}
解释都在注释里面
注意点:
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个Cookie,浏览器上限300个cookie
- Cookie大小限制4kb
删除Cookie
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效期时间为0;
Cookie并不是很安全
使用Cookie也可以传递中文数据
但是设置的value值尽量使用URLEncoder.encode()
Cookie cookie = new Cookie("LastLoginTime",URLEncoder.encode("王","utf-8"));
缺一不可(解决乱码的方式)
URLEncoder.encode()是进行编码
URLDecoder.decode()时进行解码
5.3 Session(重点)
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Sesssion就存在
- 保存信息
用户每次打开浏览器,后台服务器就会创建一个Session对象给浏览器,直到浏览器关闭,或者手动注销Session。
Session和Cookie的区别:
-
Cookie是把用户的数据写给用户的浏览器,浏览器中保存(可以保存多个)
-
Session是将用户的数据写到用户独占的Session中,服务器端保存(保存重要信息,减少服务器资源)
-
Session是由服务器创建
Session使用场景:
- 保存用户的登录信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存到Seeion中
Session的一些方法:
long getCreationTime();
String getId();
long getLastAccessedTime();
ServletContext getServletContext();
void setMaxInactiveInterval(int var1);
int getMaxInactiveInterval();
/** @deprecated */
@Deprecated
HttpSessionContext getSessionContext();
Object getAttribute(String var1);
/** @deprecated */
@Deprecated
Object getValue(String var1);
Enumeration<String> getAttributeNames();
/** @deprecated */
@Deprecated
String[] getValueNames();
void setAttribute(String var1, Object var2);
/** @deprecated */
@Deprecated
void putValue(String var1, Object var2);
void removeAttribute(String var1);
/** @deprecated */
@Deprecated
void removeValue(String var1);
void invalidate();
boolean isNew();
- 部分方法测试
public class Session01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//输出对象方法
PrintWriter writer = resp.getWriter();
/* 获取Session(由于是服务器给客户端(浏览器)创建Session对象,
所以我们只能从客户端获取Session,所以使用request)
*/
HttpSession session = req.getSession();
//给Seesion设置一些值
session.setAttribute("name","王");
//将SessionId输出到浏览器
writer.write(session.getId());
//判断Session是不是新的
writer.print(session.isNew());
//输出我们设置的值
writer.print((String)session.getAttribute("name"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
注销Session
注销session就相当于重新打开浏览器,如果我们没有关闭浏览器服务器会立刻给我们生成一个新的session
1、在我们的Servlet类中注销
//注销session session.invalidate();
2、在我们web.xml中配置Session失效时间(会话自动过期)
<session-config> <!--以分钟为单位--> <session-timeout>1</session-timeout> </session-config>
6、JSP
就是我们的Servlet
6.1 jsp基础语法
-
jsp表达式(<% %>内写java代码)
<%--jsp表达式--%> <%-- 将程序结果输出到客户端 <%=变量或表达式%> --%> <%=new Date()%> <%--jsp脚本片段--%> <% int sum=0; for (int i=1;i<=100;i++){ sum+=i; } out.println("<h1>"+sum+"</h1>"); %> <%--可以在代码中嵌入html元素 输出5个hello--%> <% for(int i=1;i<=5;i++){ %> <h1>hello <%=i%></h1> <% } %> <%-- <%!%>可以定义全局变量(jsp声明) --%> <%! static { System.out.println("Loading"); } %>
jsp声明是将变量或表达式定义在jsp生成的类中
其他都是定义在jsp生成类中的方法里
jsp声明作用域较高
-
EL表达式
**${} ** 也可以输出值,取出值
-
jsp注释在客户端无法看到 而html注释却可以看到
6.2 jsp指令
<%@ %>
<%@ page %>
<%@ include %> (嵌入其他页面)
-
定制错误页面
-
在jsp页面中配置
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--发生出错误就跳转到erroe.jsp--%> <%@ page errorPage="error.jsp" %> <html> <head> <title>test</title> </head> <body> <% int i=1/0; %> </body> </html>
-
在web.xml文件中配置
<error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page>
-
6.3 九大内置对象
- PageContext
- Request
- Response
- Sesssion
- Application (ServletContext)
- Config (ServletConfig)
- out
- page
- Exception
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>内置对象</title>
</head>
<body>
<%--内置对象--%>
<%
/*保存值*/
pageContext.setAttribute("name1x","王炸1");//保存的数据只在一个页面中有效
request.setAttribute("name2x","王炸2");//保存的数据只在一次请求中有效,请求转发会携带该数据
session.setAttribute("name3x","王炸3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4x","王炸4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%
/*方法一:取出值*/
String name1=(String) pageContext.getAttribute("name1x");
String name2=(String)request.getAttribute("name2x");
String name3=(String)session.getAttribute("name3x");
String name4=(String)application.getAttribute("name4x");
%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%
/*方法二:findAttribute 从底层找到高层(作用域)*/
String name11=(String) pageContext.findAttribute("name1x");
String name12=(String) pageContext.findAttribute("name2x");
String name13=(String) pageContext.findAttribute("name3x");
String name14=(String) pageContext.findAttribute("name4x");
%>
<h2>${name11}</h2>
<h2>${name12}</h2>
<h2>${name13}</h2>
<h2>${name14}</h2>
</body>
</html>
作用域:
page<request<session<application
6.4 jsp标签、jstl标签、EL表达式
需要导包
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式: ${}
- 获取数据
- 执行运算
- 获取web开发对象
jsp标签
-
<%--引入其他jsp文件--%> <jsp:include page="error.jsp"></jsp:include>
-
<%--转发--%><%--还可以携带参数--%> <jsp:forward page="JspTag2.jsp"> <jsp:param name="name" value="汪涵桑"/> </jsp:forward>
<% //取出参数 String name=request.getParameter("name"); out.write(name); %>
Jstl表达式:
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
我们只需要了解核心标签即可
使用核心标签需要导入头文件
<%--引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6lYgl6p-1635061152621)(image-20211024132123562.png)]
在我们测试中发现一个错误
- 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
如果我们包导的没有问题,这种情况我们就需要手动往Tomcat的lib文件下导入jstl和standard这两个包
<body>
<form action="JstlTag.jsp" method="get">
<%--使用EL表达式获取数值--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="提交">
</form>
<%--若登录的是admin,我们就让他登录成功--%>
<%--第一种使用jstl标签--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="欢迎您"/>
</c:if>
<c:out value="${isAdmin}"></c:out>
<%--第二种,使用java代码--%>
<%
if(((String)request.getParameter("username")).equals("admin")){
out.write("欢迎");
}
%>
<%--定义一个变量--%>
<c:set var="scode" value="23"></c:set>
</body>
7、MVC三层架构
MVC:Model view Controller(模型,视图,控制器)
-
Controller
控制器
Servlet层
- 接受用户请求
- 响应客户端内容
- 重定向或转发(视图跳转)
-
View
视图层
Jsp
- 展示数据
- 提供用户操作
由于Servlet和JSP都可以写java代码,为了便于维护我们尽量做出一些规范
Servlet专注于请求
JSP专注于显示数据
-
业务层(Service)
用于完成业务操作(登录,查询等)
-
JavaBean(dao)
连接数据库,CRUD
Model包括业务层和Dao(JavaBean)层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3dDAFAb-1635061152622)(image-20211024145741713.png)]
8、Filter
Filter:过滤器
- 处理中文乱码
- 登录验证。。。。
测试
-
编写一个过滤器
public class EncodingFiler implements Filter { //初始化 服务器只要一启动就开始初始化 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器初始化"); } //实现过滤的内容 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html"); //这个必须写,否则无法是程序运行下去 filterChain.doFilter(servletRequest,servletResponse); } //销毁 只有服务器关闭时才销毁 public void destroy() { System.out.println("过滤器销毁"); } }
-
编写一个Servlet
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().print("我是人类"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
在web.xml中配置过滤器
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.wang.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.wang.filter.EncodingFiler</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>testServlet</servlet-name>
</filter-mapping>
可以自行测试