jsp
配置jdk,配置tomcat,启动tomcat只需要在cmd中startup即可
127.0.0.1:8080
访问这个,必须要先startup tomcat才行
创建文件时报错:Address localhost:1099 is already in use
解决方法:在cmd中输入
netstat -ano | find "1099"
tasklist | find "69956"
69956是上一个命令得出来的pid码
taskkill /f /t /im java.exe
java.exe是上一个命令得到的进程的名字
新建war包:
1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PASsgU35-1627030483308)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195151525.png)]
2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLaUbrLR-1627030483309)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195239417.png)]
3.apply然后ok
4.buildwar包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-leSBZfRZ-1627030483310)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195336959.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFO5ftaq-1627030483312)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195405872.png)]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYABM7JS-1627030483313)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195438425.png)]
在Tomcat里部署war包:
1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvvuy8aV-1627030483314)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195701525.png)]
2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3Q5fmr4-1627030483314)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195721023.png)]
3.aply ok
创建servlet类
1.在src文件里面创建如图的类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DClF33sW-1627030483315)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204121296.png)]
2.继承HttpServlet类的时候发现没有这个类,就需要添加jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdQqLk7p-1627030483315)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204314796.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtnCa9bi-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204418175.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItCSZzzK-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204441877.png)]
4.然后在tomcat的lib里面找到对应的包把它复制到lib里面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfi0uMCh-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204712829.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6i2zcILx-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204905355.png)]
5.最后把lib添加到文件中作为库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuBWxSH6-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205241647.png)]
于是就有了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDhiroOQ-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205319128.png)]
然后就可以重写里面的方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JMKnE7R6-1627030483318)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205637010.png)]
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String header=req.getHeader("content-type");
System.out.println(header);
PrintWriter writer=resp.getWriter();
writer.write("<h1>hello<h2>");
writer.flush();
writer.close();
}
6.配置servlet的路径,在web.xml文件中配置
<servlet>
<servlet-name>user</servlet-name>
<servlet-class>com.xinzhi.controller.User</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user.do</url-pattern>
</servlet-mapping>
之后就可以用…/user.do访问这个网页了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kBoNNd2-1627030483318)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720092738984.png)]
也可以直接进行注释配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxt31s5g-1627030483319)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720111233692.png)]
7.解决中文的乱码问题
在servlet类中添加如下的语句:
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type","text/html;charset=utf-8");
第一句的作用是保证服务器(本地)处理的时候按照utf-8处理字符串
第二句的作用是保证客户端处理的时候按照utf-8处理字符串,第二句更重要,第一句可以不写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vbkne7hu-1627030483319)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720093534117.png)]
url的匹配规则
1.精确匹配:<url -pattern>中配置的项必须与url完全精确匹配。
<url-pattern>/user/users.html</url-pattern>
<url-pattern>/index.html</url-pattern>
<url-pattern>/user/addUser.action</url-pattern>
**2. 路径匹配:**以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
<url-pattern>/user/*</url-pattern>
3.扩展名匹配 *.
以任何结尾为*.后的扩展名的网页会被匹配
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
4.缺省匹配
<url-pattern>/</url-pattern>
匹配顺序
-
精确匹配。
-
路径匹配,先最长路径匹配,再最短路径匹配。
(就是说/user/app会优先于/user)
-
扩展名匹配。注意:使用扩展名匹配,前面就不能有任何的路径。
-
缺省匹配,以上都找不到servlet,就用默认的servlet,配置为<url-pattern>/< /url-pattern>
欢迎页
就是啥都不干默认打开的界面,默认是index.jsp
<welcome-file-list>
<welcome-file>/hello.html</welcome-file>
</welcome-file-list>
可以连接到web文件夹里面的文件,也可以匹配servlet url匹配的网页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aHD6uMB-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720101948347.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuZyj1J5-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720102007211.png)]
请求传参(doGet):
req.getParameter用来获取请求的传入的参数,后面的String类型的变量表示这个参数是什么
user中:
@WebServlet("/user.do")
public class User extends HttpServlet {
private userdao dao=new userdao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type", "text/html;charset=utf-8");
String username = req.getParameter("username");
String age = req.getParameter("age");
dao.cun(username,age);
}
}
userdao中:
public class userdao {
public void cun(String name,String age)
{
System.out.println("存数据");
System.out.println(name+"+"+age);
}
}
如何传参:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5kLspqi-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720131526644.png)]
以?(必须是英文的问号)开始,然后user中定义了什么类型的参数就传什么样的参数进去
两个参数之间用&号连接
成功之后后端就有结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VX3le6cU-1627030483321)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720132045437.png)]
另一种方法,一次传多组同类的参数:
String[] username=req.getParameterValues("username");
for (String name:username) {
System.out.println(name);
}
这样就不用dao类用foreach直接输出,req.getParameterValues指一次可以传入多个这个类型的参数
传表单:(只能用doPost)
1.先在index.jsp中添加一个表单
<form method="post" action="/servelet_study_war_exploded/user.do">
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="点此提交">
</form>
需要注意的是这个action里的网址一定要写完整,就是8080后面的那一串都要写上去,不然就会404
method也一定要改成post
2.在user中重写doPost
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type", "text/html;charset=utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
3.成功后就会在后端中输出数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPBiI3hc-1627030483321)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720141634510.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWFEE5ti-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720141653286.png)]
请求转发:
新建一个servlet并且完成配置
@WebServlet("/user2.do")
public class User2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type", "text/html;charset=utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("This is User2.");
System.out.println(username);
System.out.println(password);
}
然后在原有的User上加上转发的代码:
req.getRequestDispatcher("/user2.do").forward(req,resp);
第一个空里填要转发的目标servlet的地址,第二个填req和resp(就是把请求和响应都给转发过去)
也可以这么写:
RequestDispatcher rd = request.getRequestDispatcher("/User2");
rd.forward(req, resp);
然后转发成功的结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3X0rUNiN-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720152751873.png)]
request域方法
添加:
req.setAttribute("a","1");
req.setAttribute("b","2");
req.setAttribute("c","3");
req.getRequestDispatcher("/user2.do").forward(req,resp);
-
注意:要先进行存值操作然后再进行转发操作
-
前面是key后面是object(int,string等等都可以,甚至可以是个对象),把这些东西加到了请求的域里面,后续的转发都可以使用
-
就把域想象成一个哈希表,通过键值可以存储也可以提取物品进行使用
使用:
System.out.println(req.getAttribute("a"));
System.out.println(req.getAttribute("b"));
System.out.println(req.getAttribute("c"));
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeKDpJr6-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720162003312.png)]
响应头:
是服务器发送给客户端浏览器,告诉浏览器要做什么
使用response对象的setHeader()方法来设置响应头
response.setHeader(“content-type”, “text/html;charset=utf-8”);
作用是告诉浏览器器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”);
response.setHeader("Refresh","5; URL=http://www.baidu.cn")
5秒后跳转百度
响应输出:
PrintWriter writer =resp.getWriter();
writer.write("<html>");
writer.write("<h1>title</h1>");
writer.write("</html>");
注意这个相应输出一定要写在最后转发的那个servlet里面,不然就会没有效果
我这里user2转发user,相应输出写在user2里面,网页就如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tKe0yiM-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720195757545.png)]
是在user.do里面显示的,因为这是服务器转发,客户端浏览器不知道后端转发做了什么,他只显示在最开始的那个servlet界面上
注意resp.getWriter()是有缓冲区的,当要输出的内容小于8kb的时候就会一直放在缓冲区,必须要加上resp.flushBuffer();
响应解决乱码:
response.setContentType("text/html;charset=utf-8")
response.addHeader("content-type", "text/html;charset=utf-8")
两种方法是等价的,都是既处理了服务器里的中文字(即包response.setCharaceterEncoding(“utf-8”)),也处理了客户端里的中文字
请求说到底就是浏览器上的操作发送到服务器内部进行处理,响应就是服务器内部的操作要在浏览器上显示出来
重定向
response.setStatus(302);
response.setHeader("Location", "http://www.baidu.com");
上面代码的作用是:当访问Servlet后,会通知浏览器重定向到百度主页。客户端浏览器解析到响应码
为302后,就知道服务器让它重定向,所以它会马上获取响应头Location,然发出第二个请求。
-
重定向是两次请求(服务器发一次,浏览器发一次),请求转发是一次
-
重定向的URL可以是其他应用,不局限于当前应用
-
重定向的响应头为302,并且必须要有Location响应头
-
重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常
重定向和转发的区别:
- 重定向是两次请求,请求转发是一次
- 重定向是浏览器的行为,请求转发是服务器行为
- 重定向浏览器的地址会发生改变,转发不会
- 重定向可以重定向到任何地址,转发只能在项目内转发
jsp
jsp本质上就是html,通过一些特殊的手段将.jsp文件用.java文件写了出来,将jsp中的html语句自动转化为了响应输出:jsp的本质其实就是个html模板,编译器会根据模板生成对应的servlet。
服务器不能识别html文件,浏览器也不能识别jsp文件,所以jsp文件就在服务器被转化成了servlet文件,然后再在浏览器中响应
PrintWriter writer =resp.getWriter();
writer.write("<html>");
先要把相应的jar包导到lib中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktyTXpsy-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210721093021675.png)]
语法
1.语句块:
jsp中html语句正常使用,Java的语句块用<% %>括起来
<%
System.out.println("123");
response.getWriter().write("abc");
%>
注意:这里只有abc能被打到浏览器界面上,因为System.out.println是被输出到后端上的,想要输出到浏览器上就必须使用响应输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVjC0PZ5-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210721100806176.png)]
2.脚本表达式
表示用<%= %>括起来的东西是java里面的东西,可以是变量也可以是表达式,表达式必须能求值使用方法:
<%
for(int i=0;i<10;i++){
%>
<h1>
<%=i%>
</h1>
<%
}
%>
这样的话i就会被视作上个java语句中的变量i,就会从1到9逐渐打印出来
不然如果直接写<%i%>的话,这个i就是i,就是在页面上打印上10个i
3.静态方法的声明
方法的声明必须使用<%! %>,因为只有这样方法才能被写到类里面,不然的话就会被写到server方法里面,方法写在方法里面肯定会报错
4.三种注释
1.html注释 这个注释能在网页上被看见,就是浏览器f12就能看见注释,但是页面上还是看不见注释的
2.jsp注释<%-- --%> 这个注释比较特殊,只会在jsp文件内部以及被编译过后的java文件中显示,别的地方都看不见
3.java注释 // 这个就是最普通的后端代码的注释
指令
<%@ 指令名 属性1 = "属性1的值" 属性2 = "属性2的值" ....%>
-
指令名:用于指定指令名称 在JSP中包含page include raglib 这3种指令
-
属性: 用于指定指令属性名称 不同的指令包含不同的属性 在同一个指令中可以设置多个属性 各个属性之间用逗号或者空格隔开
1.page
用于设置整个jsp界面的属性
- language
page language="java"
语言设置为Java,不写也没事
- import
page import="java.util.*"
作用是导入Java的类包,比较重要
- pageEccoding(contentType)
page contentType ="text/html;charset=UTF-8"
2.include
用于在一个jsp文件中引入另一个jsp文件
include file="a.jsp"
标签
1.< jsp:include>(要有< /jsp:include>结尾)
<jsp:include page="a.jsp"></jsp:include>
和指令的区别在于标签是动态引入,在编译时会被编译成两个servlet,然后在执行时再将两个servlet内容合并,即JSP页面运行时才将文件加入
2.<jsp:forward >(也是要有结尾的) 以及<jsp:param >(没有结尾
<jsp:forward page="a.jsp">
<jsp:param name="user" value="littlered">
</jsp:forward>
forword就是请求转发,会直接跳转到另一个指定的jsp界面
param就是域操作,就是把东西以键值存进域中,然后在那个a.jsp中可以使用request.getParameter(“user”)取出键值为user对应的数据
内置对象
1.request response 对象
servlet中怎么用jsp里也怎么用
2.session对象
指的是客户端与服务器的一次会话 , 从客户连接到服务器的一个 WebApplication 开始 , 直到客户端与服务器断开连接为止
使用:
session.setAttribute(“userName”,”wfpan”);
session.setAttribute(“pwd”,”123”);//登录成功
session.setMaxInactiveIntervalTime();
session.getAttrite();
session.invalidate(); //退出登录
mvc三层架构
1.model
主要是javabean实体类对象,提供多个set和get的方法,通过jdbc读取到数据库里的数据然后转到controller里面
2.view
主要是jsp界面,向controller提供数据,然后在浏览器界面上显示数据
3.controller
rd就是请求转发,会直接跳转到另一个指定的jsp界面**
param就是域操作,就是把东西以键值存进域中,然后在那个a.jsp中可以使用request.getParameter(“user”)取出键值为user对应的数据
内置对象
1.request response 对象
servlet中怎么用jsp里也怎么用
2.session对象
指的是客户端与服务器的一次会话 , 从客户连接到服务器的一个 WebApplication 开始 , 直到客户端与服务器断开连接为止
使用:
session.setAttribute(“userName”,”wfpan”);
session.setAttribute(“pwd”,”123”);//登录成功
session.setMaxInactiveIntervalTime();
session.getAttrite();
session.invalidate(); //退出登录
mvc三层架构
1.model
主要是javabean实体类对象,提供多个set和get的方法,通过jdbc读取到数据库里的数据然后转到controller里面
2.view
主要是jsp界面,向controller提供数据,然后在浏览器界面上显示数据
3.controller
servlet对象,一般是在servlet初始化一个实体类,然后把jdbc查询结果存进去,这是与model的交互,然后注意,在servlet里面把请求转发到一个jsp文件中,那么这个servlet就会自动显示jsp文件中的界面,并且界面的url仍然是servlet的url而不是jsp文件的url,这样就可以设计前端了