Servlet-Ajax-JSP
1.Ajax
作用:
(1)网页异步、局部更新的JS组件
(2)模拟Http请求,处理Http响应
(3)模拟所有请求类型、所有mime类型以及文件上传、下载、跨域请求
如何使用JQuery提供的Ajax组件完成Http请求和响应的处理
(1)如何编写Ajax
++ 引入JQuery
<script src="../../lib/jquery-3.6.0-min.js" type="text/javascript"></script>
++ 编写ajax内容(编写js内容)
前端部分
<button onclick="toAjax()">调用ajax</button>
<select id="mySelect">
<option value="0">--请选择--</option>
</select>
<script>
function toAjax(){
//调用一个ajax
$.ajax({
url:"http://localhost:8080/JavaServletDemo/textServlet",
type:"GET",
data:{name:"马花子"},
dataType:"JSON",
success:function(data){
console.dir(data);
for(var i in data.data){
$("#mySelect").append("<option value='"+i+"'>"+data.data[i].name+"</option>")
}
},
error:function(XMLHttpRequest, textStatus, errorThrown){
console.dir("请求失败!");
}
});
}
</script>
后端Servlet部分:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Result res = new Result();
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/json;charset=UTF-8");
PrintWriter writer = resp.getWriter();
List<Map<String,String>> list = new ArrayList<>();
for(int i=0;i<5;i++){
Map<String,String> map = new HashMap<>();
map.put("name","昆明"+(i+1));
list.add(map);
}
res.setData(list);
writer.print(res.toString());
writer.flush();
writer.close();
}
(2)ajax的组成
ajax是$,JQuery对象的一个ajax()方法
$.ajax();
配置属性:
url: 请求地址,要求为String类型的参数,(默认为当前页地址)发送请求的地址。
type: 请求类型,GET、POST,默认为GET
timeout:最长请求时间,单位毫秒,是Number类型
async:异步参数:true=》异步执行(默认),false=》同步执行
data:参数属性:传入一个JSON对象,如 data:{userID:1}
dataType:预期服务端响应数据类型,主要有:JSON、HTML、TEXT、JSONP
contentType: 设置请求的mime类型,application/json
配置回调函数:
beforeSend : 发送前的回调
beforeSend:function(XMLHttpRequest){
//在执行前会被调用
}
complete:请求完成之后回调方法(不管请求成功或失败都执行)
complete:function(XMLHttpRequest,textStatus){
//在执行后会被调用(不管请求成功或失败都执行)
}
success:请求成功发送,响应成功接收
success:function(data, textStatus){
//data可能是xmlDoc、jsonObj、html、text等等
//textStatus ajax执行状态编码
}
error:请求失败,无法接收正常响应时调用
error:function(XMLHttpRequest, textStatus, errorThrown){
//通常情况下textStatus和errorThrown只有其中一个包含信息
//调用本次ajax请求时传递的options参数
//errorThrown : 异常对象
}
2.JSP(服务端页面模板技术 Java Server Page)
作用:
(1)实现网页动态化加载
(2)可以在JSP页面上同时编写HTML、JS、CSS和JAVA
(3)简化Servlet返回HTML代码的复杂问题
2.1 JSP页面的创建方式
在项目中右键创建文件选择JSP File
2.2 JSP的编译过程
(1)将JSP页面编译成一个.java的java源文件,如:studnet.jsp => student_jsp.java
(2)源文件的内容
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext; //页面作用域对象
javax.servlet.http.HttpSession session = null; //Session对象
final javax.servlet.ServletContext application; //ServletContext上下文对象
final javax.servlet.ServletConfig config; //Servlet配置对象
javax.servlet.jsp.JspWriter out = null; //JSP的输出流对象
final java.lang.Object page = this; //page: 当前Servlet实例对象
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html; charset=utf-8");//设置ServletResponse的mime类型
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;
/* 将我们编写在jsp中的html转换为输出html的代码 */
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("我是blankNew.jsp文件<br>\r\n");
/* 编写的jsp脚本 */
for(int i=0;i<10;i++){
System.out.println("在控制台打印");
}
out.write("\r\n");
out.write("您的IP地址:");
/* jsp输出脚本 */
out.print(request.getRemoteAddr() );
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
(3) 编译源文件=》.class
(4)当网页访问JSP文件时,自动调用生成的jsp.java文件中的_jspService方法进行Servlet调用输出响应
2.3 JSP编写内容
(1)JSP脚本
可以在里面编写Java源代码,在<%和%>之间可以编写java代码
<body>
<!-- JSP脚本 -->
<%
//java代码
for(int i=0;i<5;i++){
System.out.println("你好!"+i);
}
%>
</body>
(2)输出表达式<%= %>
可以调用JAVA代码中的方法、变量进行页面的输出渲染
<body>
我的IP地址:<%=request.getRequestURL() %>
<!-- 如果<%=Obj 是一个对象,则输出对象的toString方法内容 -->
</body>
(3)注释(JSP 的注释)
<%-- 注释内容 --%>
(4)声明元素 <%! %>
<%-- JSP声明元素 --%>
<%!
private String userName = "admin";
public String getName(){
return "王丘";
}
%>
我的用户名:<%=userName %>我的账号:<%=getName()%>
注意:jsp脚本中能定义变量但是是局部变量
<%-- 在jsp脚本中无法定义方法,但是能定义局部变量,是_jspService方法的局部变量 --%>
<%
String userName = "admin";
%>
我的用户名:<%=userName %>我的账号:
2.4 JSP页面跳转中的操作
(1)*Servlet请求重定向到JSP(Servlet 重定向 JSP)
resp.sendRedirect(pathHead+"/views/student/index.jsp");
(2) JSP请求重定向到JSP
<!-- 可以再jsp脚本中通过response内置响应对象完成请求重定向操作 -->
<%
response.sendRedirect("error.jsp");
%>
(3)* JSP 请求重定向到 Servlet
<!-- 可以再jsp脚本中通过response内置响应对象完成请求重定向操作 -->
<%
response.sendRedirect("http://localhost:8080/JavaServletDemo/login");
%>
( 4 )* Servlet可以请求转发到JSP
Servlet代码:
//请求转发到jsp页面,夹带参数传递
req.setAttribute("className","华为20211024JAVA实训班");
req.getRequestDispatcher("views/student/index.jsp").forward(req,resp);
jsp代码:
<!-- 接收来自Servlet转发的参数 -->
接收参数:<%=request.getAttribute("className")%>
(5)* 表单请、Http请求到JSP
表单请求代码:
<!-- 提交表单给JSP -->
<form action="index.jsp" method="get">
<label>用户名</label>
<input type="text" name="userName" />
<label>密码</label>
<input type="password" name="pwd" />
<input type="submit" value="登录" />
</form>
jsp代码:
<body>
<!-- 接收来自客户端表单发送的请求参数 -->
用户名:<%=request.getParameter("userName")%><br/>
密码:<%=request.getParameter("pwd")%>
</body>
2.5 JSP 内置对象
1. 常用内置对象
++ request: HttpServletRequest对象,请求对象
++ response:HttpServletResponse对象,响应对象
++ session: HttpSession对象,服务端会话对象
++ application:ServletContext对象,Servlet容器上下文对象
++ config: ServletConfig对象,Servlet实例配置对象
++ out: JspWriter对象,jsp实例的输出流对象
2.内置对象-Request对象
作用:处理客户端请求
可以接收请求或者请求转发的请求参数、内置参数等等
3.内置对象-Response对象
作用:响应客户端请求
4.内置对象-Session对象
作用:保存服务端的会话
servlet代码:
HttpSession session = req.getSession();
session.setAttribute("userName","admin");
session.setAttribute("realName","马化腾");
req.getRequestDispatcher("views/student/index.jsp").forward(req,resp);
jsp代码:
<body>
<!-- 从session中获取参数 -->
<%
//可以在jsp中操作Session相关的所有方法
session.setMaxInactiveInterval(5);
%>
用户名:<%=session.getAttribute("userName")%><br/>
真是姓名:<%=session.getAttribute("realName")%>
</body>
注意:
客户端与服务端产生会话时,会保存一个JSessionID到客户端Cookie中存储,目的就是判断是不是同一个会话的客户端
5.内置对象out-输出对象
out对象是JspWriter对象
在使用前需要引入javax.servlet.jsp-api包
pom.xml中引入
<!-- jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
引入后idea中才能在jsp中写out对象
<%
//特殊处理java内容再输出时才会用到out对象
Date date1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
out.print(sdf.format(date1));
%>
6.内置对象-application(ServletContext对象)
#常用方法
void setAttribute(String key,Object value) 以key/value的形式保存对象值
Object getAttribute(String key) 通过key获取对象值
String getRealPath(String path) 返回相对路径的真实路径
7.内置对象-config(ServletConfig对象)
使用方法同ServletConfig对象
8.内置对象-page(代表当前jsp对应的Servlet实例)
<%
//通过反射也可以创建当前jsp的servlet实例
Class<?> aClass = Class.forName("org.apache.jsp.views.student.index_jsp");
Object o = aClass.newInstance();
out.println(o);//输出创建的实例
out.println(page);//输出当前jsp实例
%>
2.6 JSP指令
1.include指令 <%@ include file="引入的文件名称" %>
创建一个公共jsp页面提供给每个页面进行引入
<%--
每个页面都需要引入的内容
--%>
<%
//basePath,定义一个公共的局部变量保存请求的资源URI
//http://localhost:8080/JavaServletDemo
String scheme = request.getScheme();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String contextPath = request.getContextPath();
String basePath = scheme+"://"+serverName+":"+serverPort+contextPath;
//再放入servletContext - application对象
application.setAttribute("basePath",basePath);
%>
<script src="<%=basePath%>/lib/jquery-3.6.0-min.js" type="text/javascript"></script>
<script src="<%=basePath%>/lib/layui/layui.js" type="text/javascript"></script>
<link href="<%=basePath%>/lib/layui/css/layui.css" rel="stylesheet" type="text/css" />
每个页面使用include指令引入页面即可
在页面开头引入
<%@ include file="../common/common.jsp" %>
2.7 作用域
作用域的分类:
page作用域:对应的作用域访问对象为pageContext 对象
request作用域:对应的作用域访问对象为request 对象
session作用域:对应的作用域访问对象为session 对象
application作用域:对应的作用域访问对象为application 对象
1.页面作用域-page(pageContext对象)
#在include页面中
<%
//页面请求转发.include
pageContext.setAttribute("name","ABC");
%>
#在父页面中
<%=pageContext.getAttribute("name")%>
结果能够取到说明:在include情况下,是共享同一个页面作用域的
(1)pageContext.include方法
在页面2:
<body>
错误页面
<%=pageContext.getAttribute("name")%>
</body>
在页面1:
XXXXX
<%
//页面请求转发.include
pageContext.setAttribute("name","ABC");
//include方法相当于jsp的include指令,将另一个页面的内容包含到当前位置(通过java代码的方式实现)
pageContext.include("error.jsp");
%>
最终结果:
XXXXX 错误页面 null
注意:页面作用域只能在当前页面使用,无法转发共享
2.请求作用域-request
作用:在多个jsp之间请求转发、或者jsp请求jsp,request对象共享
3.会话作用域-session
作用:在同一个会话中共享请求、页面
4.上下文作用域-application
作用:在多个jsp页面以及Servlet实例之间共享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~