文章目录
- 体验java web
- JSP介绍
- JSP的特性
- 转发和重定向
- session作用域
- application作用域
体验java web
IDEA2021创建java web项目参考如下文章:
Intellij IDEA2021.1创建Java web项目(超详细)
JSP介绍
在新创建好的java web项目中的web目录下创建一个index1.jsp文件,IDEA会生成一段代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
JSP是一个java服务页面,是sun公司发明的基于java代码的多元化的页面,仍然是html的形式来显示,可以写html css js还可以写java代码,目的是为了需要渲染数据,JSP页面其实是一个java类,只不过呈现的表面是一个html文件,目的是为了方便使用。
- JSP页面如何编写java代码:
使用<%java代码%>
进行编写
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
%>
- JSP页面如何引入java相关类
使用<%@page import="java相关类"%>
<%@page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
在IDEA中当你敲到java的代码时,编辑器会自动帮你引入相关的类。
代码如下:
<%--
Created by IntelliJ IDEA.
User: root
Date: 2021/8/12
Time: 17:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--JSP是一个java服务页面,是sun公司发明的基于java代码的多元化的页面,仍然是html的形式来显示
可以写html css js还可以写java代码,目的是为了需要渲染数据
JSP页面其实是一个java类,只不过呈现的表面是一个html文件,目的是为了方便使用
-->
请输入用户名:<input type="text" name="userName">
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
%>
<%=time%>
</body>
</html>
保存运行tomcat服务一下。
可以在IDEA中预览一下
结果如图所示:
JSP的特性
- JSP的九大内置对象,就是别人创建好了的九个对象,其中有:
out对象可以往页面中输出内容
page当前页面的对象
pageContext当前页面上下文对象
request请求对象
response响应对象
session 会话对象
application 应用程序
config 配置对象
exception异常对象
以上这些对象都属于某一个具体的类,直接拿来用就可以了,还有就是为了简化开发要在JSP中尽量少些java代码
- 四大作用域
page 当前页面,指的是在当前这个页面的范围
request 请求作用域,指的是一个请求的范围
session会话作用域,整个会话的过程,默认时间是30分钟
application当前项目作用域,是最大的范围,只要服务器不关闭这个作用域的值是共享的
- 三大指令
page用于导包,设置编码格式等
taglib导入标签库
include表示嵌套页面指令
浏览器访问网页异常后会返回一个状态码,分别表示不同的含义:
404表示请求资源不存在,90%是路径的错误
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.print("hello world");
%>
</body>
</html>
接下来使用jsp模拟一个用户登录页面输入用户名和密码:
新建一个login.jsp和getlogininfo.jsp页面
login.jsp中做一个登录的操作,请求输入用户名和密码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--method表示提交方式,默认不写就是get,可以改变为post的-->
<form action="getlogininfo.jsp" method="get">
请输入用户名:<input type="text" name="userName"><br>
请输入密码:<input type="text" name="pwd">
<input type="submit" value="登录">
</form>
</body>
</html>
在getlogininfo.jsp中获取用户输入的信息:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("userName");
String pwd = request.getParameter("pwd");
out.print("用户名是:" + name + "密码是:" + pwd);
%>
</body>
</html>
由于getlogininfo.jsp页面获取用户的用户名时可能会有中文乱码的问题,这里给出两套解决方案:
- 第一种:针对于请求方式为post可以使用request对象设置一个CharacterEncoding为UTF-8
request.setCharacterEncoding("utf-8");
- 第二种:在tomcat中找到server.xml文件,在8080端口下添加以下内容
URIEncoding="utf-8"
如图所示:
保存退出,重启tomcat服务打开页面试试。
- 用JSP页面写一个注册的页面:
register.jsp如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="reginfo.jsp">
用户名:<input type="text" name="name"><br>
密码:<input type="password" name="pwd"><br>
性别:<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女<br>
请选择城市:
<select name="city">
<option value="zz">郑州</option>
<option value="bj">北京</option>
<option value="cd">成都</option>
</select><br>
<input type="checkbox" name="hobby" value="bas">篮球
<input type="checkbox" name="hobby" value="code">敲代码
<input type="checkbox" name="hobby" value="dance">跳舞
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
reginfo.jsp如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
注册页面
<%
out.println("用户名:" + request.getParameter("name"));
out.println("密码:" + request.getParameter("pwd"));
out.println("性别:" + request.getParameter("sex"));
out.println("城市:" + request.getParameter("city"));
String[] hs = request.getParameterValues("hobby");
for (String str : hs) {
out.print("爱好:" + str);
}
%>
</body>
</html>
保存运行一下。
转发和重定向
继续完善之前的用户登录跳转页面的操作:
新建一个login1.jsp页面作为用户输入用户名和密码的页面,用户名和密码定为admin和0000,用户输入用户名和密码后悔跳转到dologin.jsp中对用户输入的信息进行处理,输入正确则登录成功,反之则登录失败
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="dologin.jsp" method="post">
用户名:<input type="text" name="name">
密码:<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
</body>
</html>
dologin.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录验证页面
<!--假设用户名时admin密码是0000-->
<%
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if (name.equals("admin") && pwd.equals("0000")) {
request.setAttribute("userName", name);
RequestDispatcher dispatcher = request.getRequestDispatcher("/success.jsp");
dispatcher.forward(request, response);
//或者是request.getRequestDispatcher("/success.jsp").forward(request,response);
//response.sendRedirect("/day01/success.jsp");//重定向
// response.sendRedirect("/day01/success.jsp");
} else {
//表示登录失败,跳转到error页面
//转发
request.getRequestDispatcher("/error.jsp").forward(request, response);
//重定向
// response.sendRedirect("/day01/error.jsp");
}
%>
</body>
</html>
success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--转发的写法--%>
登录成功<%out.print(request.getAttribute("userName").toString());%>
<%--重定向的写法--%>
<%-- 登录成功--%>
<%-- <%--%>
<%-- Object obj = request.getAttribute("userName");--%>
<%-- if(obj!=null){--%>
<%-- out.print(obj.toString());--%>
<%-- }--%>
<%-- %>--%>
</body>
</html>
error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录失败
</body>
</html>
- 转发
转发的特点:
一次请求
地址栏不会发生改变
操作是服务器端进行的也就是说转发是服务器帮我们进行的操作
转发是在当前请求的基础上进行转发的,所以只可以转发到本项目的页面
在这里转发的代码有两种写法:
//第一种
request.setAttribute("userName", name);
RequestDispatcher dispatcher = request.getRequestDispatcher("/success.jsp");
dispatcher.forward(request, response);
//第二种
request.getRequestDispatcher("/success.jsp").forward(request,response);
- 重定向
1.地址栏会进行改变
2.重定向是两次请求(所以我们放在第一个请求对象中的内容 无法获取)
3.重定向是客户端的操作
4.因为是两次请求,所以我们放在request作用域的内容无法获取
5.地址栏写的时候必须是绝对路径,因为重定向可以重定向到任何地方
输入成功后重定向的写法:
response.sendRedirect("/day01/success.jsp");
session作用域
session表示会话作用域,session的默认失效时间是30分钟,可以设置较短的时间 不设置就是默认的,当浏览器关闭这个session就失效了。
还是上面的用户登录跳转页面的代码,也可以用session作用域来书写:
在dologin.jsp中更改代码:
if (name.equals("admin") && pwd.equals("0000")) {
//表示登录成功 跳转成功页面
//转发 & 重定向
// request.setAttribute("userName", name);
session.setAttribute("userName", name);
session.setMaxInactiveInterval(5);//设置session的失效时间
response.sendRedirect("/day01/success.jsp");
} else {
//表示登录失败,跳转到error页面
//转发
request.getRequestDispatcher("/error.jsp").forward(request, response);
//重定向
// response.sendRedirect("/day01/error.jsp");
}
获取session作用域的默认失效时间:
login1.jsp中:
<%
out.print(session.getMaxInactiveInterval());//获取session作用域的默认失效时间
%>
<form action="dologin.jsp" method="post">
用户名:<input type="text" name="name">
密码:<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
success.jsp中更改:
<%
Object obj = session.getAttribute("userName");
if (obj != null) {
out.print(obj.toString());
}
/*
* 在配置文件中添加URIEncoding=utf-8
* */
%>
application作用域
新建一个index3.jsp页面,用来统计访问服务器的人数。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--application作用域--%>
<%
//所有的getAttribute都是object类型的
Object obj = application.getAttribute("count");
//如果为空 表示系统的服务器启动后还没有人访问过
if (obj == null) {
application.setAttribute("count", 1);
} else {
int newCount = Integer.parseInt(application.getAttribute("count").toString());
application.setAttribute("count", newCount + 1);
}
out.print("当前系统在线人数是:" + application.getAttribute("count"));
%>
</body>
</html>
四大作用域的大小顺序是:page < request < session < application
index4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function gotoNewPage() {
location.href = "/index5.jsp"
}
</script>
</head>
<body>
<%
session.setAttribute("name", "赵四");
%>
<input type="button" value="跳转页面" onclick="gotoNewPage()">
</body>
</html>
index5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Object obj = session.getAttribute("name");
if (obj != null) {
out.print(obj.toString());
}
%>
</body>
</html>