文章结构概览
JavaWeb简介
-
什么是Web应用程序
Web应用程序是一种可以通过Web访问的应用程序
-
静态页面与动态页面
静态页面:网页中的内容固定,不会更新
动态网页:网页中的内容通过程序动态显示,自动更新。(HTML、CSS、数据库技术、js、xml、JSP、Asp.net、Php) -
搭建Java Web开发环境
-
下载tomcat
官方下载地址:https://tomcat.apache.org/download-70.cgi
我下载的是apache-tomcat-7.0.104版本 -
启动tomcat
开启tomcat服务器:双击安装tomcat所在的目录D:\apache-tomcat-7.0.104\bin\startup.bat
关闭tomcat服务器:双击安装tomcat所在的目录D:\apache-tomcat-7.0.104\bin\shutdown.bat,
-
启动startup.bat
遇到问题:双击startup.bat出现闪退
解决方案:
① tomcat在启动时,会读取环境变量的信息,需要一个CATALINA_HOME 与JAVA_HOME的信息,CATALINA_HOME即tomcat的主目录,JAVA_HOME即java安装的主目录,jdk的主目录。
② 首先,要在环境变量处,配置JAVA_HOME,然后,如果这样配置,startup.bat还是一闪而过,可以右键点击startup.bat,编辑,在文本的最后敲上pause,保存后重新运行startup.bat,这时候窗口不会再一闪而过,而是停留在桌面上(调试成功,把pause去掉即可)。参考“双击startup.bat出现闪退”文章。
出现闪退的原因有多个:
- 端口被占用 。
“任务栏”右键单击选择“任务管理器”,点击“详细信息”,PID列为端口列,查看8080端口是否被占用,如果被占用,将占用的进程关闭,再去点击startup.bat。看是否仍然闪退。点击PID可以排序就可以方便的找到8080了,如果没有找到8080,那就说明端口并没有被占用。 - 将startup.bat进行编辑,在文件内容的开头加入如下内容,具体根据自己安装的位置来确定。文章的末尾加入“pause",目的是为了让文件中的代码执行了不立刻退出。修改好了之后保存,如果没有出现错误代码,那问题就解决了,把"pause"去掉,在浏览器的地址栏中输入“http://localhost:8080”,会出现一个有小猫的界面。
- 开始是Java10,最后卸载了重新安装的jdk1.8。我的问题是jdk的环境变量设置问题。
- 端口被占用 。
-
Tomcat服务器的目录结构
-
-
使用MyEclipse手工编写第一个Web应用程序
步骤:
①在WebApps创建项目目录–>②编写index.jsp–>③创建WEB-INF目录–>④测试运行其中:WEB-INF目录中有 classes文件夹用于储存编译生成的字节码文件 lib目录用于编译要用到的jar包
WEB-INF目录详解
-
MyEclipse配置
1). MyEclipse配置JRE
2). MyEclipse集成Tomcat服务器
把创建的项目的jdk改成自定义的jdk(我使用的版本是jdk1.8)
3). 理解MyEclipse Web项目目录结构
4). 理解Web项目虚拟路径
虚拟路径修改之后项目名称会改变 我这里没有修改虚拟路径 所以项目名称没变
-
使用Eclipse编写第一个Web应用程序
我这里使用的是dark主题 所以eclipse是黑色的 有点难看。。。
之后,发布并启动服务器
-
修改Tomcat默认端口
修改tomcat目录下 conf/server.xml文件
JSP基础语法
JSP:java server page,与servlet一样,在服务器端执行
Jsp:Java平台,安全性高,适合开发大型的,企业级的Web应用程序。
Asp.net:.Net平台,安全性以及跨平台性差
Php:简单,高效,成本低开发周期短,适合中小型企业的Web应用开发。
LAMP:Linux + Apache + MySQL + PHP
Jsp页面元素构成
- 注释
<!-- HTML注释 客户端不可见 -->
<%-- JSP注释 客户端不可见 --%>
<%
//单行注释
/*多行注释*/
%>
- 静态内容
直接写入的信息 - 指令
<%@ page language=“java” import=“java.util.*” contentType=“text/html; charset=utf-8”%>
pagez指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令
include指令:将一个额外补文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句
taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为
- isErrorPage:标识当前也是是否是错误页面。
* true:是,可以使用内置对象exception
* false:否。默认值。不可以使用内置对象exception
- 表达式
在JSP页面中执行的表达式
语法:<%= 表达式 %> //注意:表达式不以分号结束
例:
你好,<%=s %>
x+y=<%=add(10,5) %> - 小脚本
在JSP页面中执行的java代码
语法:<% Java代码 %>
例:<% out.println(“大家好,我是java!”); %> - 声明
在JSP页面中定义变量或者方法
语法:<%! Java代码 %>
例:
<%!
String s=“candy”; //声明了一个字符串变量
int add(int x,int y){//声明了一个返回整型的函数,实现两个整数的求和
return x+y;
}
%>
Jsp的生命周期
Jsp生命周期:
jspService()方法被调用来处理客户端的请求。对每一个请求, JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应-个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步问题,由于该Servlet始终驻于内存,所以响应是非常快的。
JSP内置对象
- 内置对象简介
内置对象- 在jsp页面中不需要创建,直接使用的对象
- 一共有9个:
变量名 真实类型 作用- pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
- request HttpServletRequest 一次请求访问的多个资源(转发)
- session HttpSession 一次会话的多个请求间
- application ServletContext 所有用户间共享数据
- response HttpServletResponse 响应对象
- page Object 当前页面(Servlet)的对象 this
- out JspWriter 输出对象,数据输出到页面上
- config ServletConfig Servlet的配置对象
- exception Throwable 异常对象
JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象。
<%
int[] value = {60,70,80};
for(int i:value){
out.println(i);
}
%>
什么是缓冲区
缓冲区:Buffer,所谓缓冲
区就是内存的一块区域用来保存临时数据。
- 四种作用域范围
Application:4 Session:3 Request:2 Page:1
- out
out对象是JspWriter类的实例,是客户端输出内容常用的对象
- request/response
request
例子:
request.jsp
reg.jsp
request对象实例:
源码:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>request内置对象</h1>
<%
request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL传递中文出现的乱码问题。
request.setAttribute("password", "123456");
%>
用户名:<%=request.getParameter("username") %><br>
爱好 :<%
if(request.getParameterValues("favorite")!=null)
{
String[] favorites = request.getParameterValues("favorite");
for(int i=0;i<favorites.length;i++)
{
out.println(favorites[i]+" ");
}
}
%> <br>
密码:<%=request.getAttribute("password") %><br>
请求体的MIME类型:<%=request.getContentType() %><br>
协议类型及版本号: <%=request.getProtocol() %><br>
服务器主机名 :<%=request.getServerName() %><br>
服务器端口号:<%=request.getServerPort() %><BR>
请求文件的长度 :<%=request.getContentLength() %><BR>
请求客户端的IP地址:<%=request.getRemoteAddr() %><BR>
请求的真实路径:<%=request.getRealPath("request.jsp") %><br>
请求的上下文路径:<%=request.getContextPath() %><BR>
</body>
</html>
response
例子:
outer对象总是在最上面打印输出 但是当你强制清空缓冲区时out.flush(),可以把内置对象显示在前面
(1)get与post区别
(2)请求重定向与请求转发的区别
例子:
重定向: 你先去了A局,A局的人说:“这个事不归我们管 ,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发: 你去了A局, A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿, 自己到后面办公室联系了B的人,让他们办好后,送了过来。
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>
<%
response.setContentType("text/html;charset=utf-8"); //设置响应的MIMI类型
out.println("<h1>response内置对象</h1>");
out.println("<hr>");
//out.flush();
PrintWriter outer = response.getWriter(); //获得输出流对象
outer.println("大家好,我是response对象生成的输出流outer对象");
//response.sendRedirect("reg.jsp");//请求重定向
//请求重定向
//response.sendRedirect("request.jsp");
//请求转发
request.getRequestDispatcher("request.jsp").forward(request, response);
%>
-
session
(1)什么是session
Session:表示客户端与服务器的一次会话。具体到Web中的Session
指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的
这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定
义中我们可以看到, Session实际上是一个特定的时间概念。
● session表示客户端与服务器的一次会话
● Web中的session指的是用户在浏览某个网站时 ,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间
● 从上述定义中可以看到, session实际上是- 一个特定的时间概念
(2)session对象
●session对象是一个JSP内置对象。
●session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
●从一个客户打开浏览器并连接到服务器开始 ,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
●当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
●session对象是HttpSession类的实例。
(3)session生命周期
创建
当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此Sessionld携带过去,服务端会对此SessionId进行校验。
活动
●某次会话当中通过超链接打开的新页面属于同一次会话。
●只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
●除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。
注意事项: 注意原有会话还存在,只是这个旧的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。
销毁
Session的销毁只有三种方式:
1. 调用了session.incalidate()方法
2. Session过期(超时)
3. 服务器重新启动
-
application
●application对象实现了用户间数据的共享,可存放全局变量。
●application开始于服务器的启动,终止于服务器的关闭。
●在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
●在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
●服务器的启动和关闭决定了application对象的生命。
●application对象是ServletContext类的实例。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>application内置对象</h1>
<%
application.setAttribute("university", "西电");
application.setAttribute("postcode", "331700");
application.setAttribute("email", "lisi@163.com");
%>
所在城市是:<%=application.getAttribute("city") %><br>
application中的属性有:<%
Enumeration attributes = application.getAttributeNames();
while(attributes.hasMoreElements())
{
out.println(attributes.nextElement()+" ");
}
%><br>
JSP(SERVLET)引擎名及版本号:<%=application.getServerInfo() %><br>
</body>
</html>
- 其他内置对象
page对象
pageContext对象和config对象
exception对象
JavaBeans
-
JavaBean简介
Javabeans就是符合某种特定的规范的Java类。使用Javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性。 -
JavaBean设计模式
-
Jsp中如何使用Javabean
- 像使用普通的java类一样,创建javabean实例
- 在jsp页面中通常使用jsp动作标签使用javabean
useBeans动作
setProperty动作
getProperty动作
什么是JSP动作?
JSP动作元素( action elements ) ,动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。
-
jsp:useBeans
作用:在jsp页面中实例化或者在指定范围内使用javabean
<jsp:useBean id=“标识符” class= “java类名” scope=“作用范围”/>
- jsp:getProperty
【property = " * " 】根据名称进行匹配,根据表单提交过来的所有参数的名字和javaBeans中的属性名字来进行匹配,匹配上则自动赋值
【property = " javaBean属性名 " 】对部分属性进行匹配,指定的属性名字和表单传过来的属性名字进行匹配
只匹配了用户名 没有匹配密码 所以密码为空
【property = " javaBean属性名 " value = “BeanValue”】把value值传递给属性 表单传递的值时没有效果的 又被人为手工设置了新的值
【property = " propertyName " param = “request对象中的参数名” 】跟request参数关联 不一定是表单传递过来的参数 可以使url地址传递过来的参数
- jsp:setProperty
作用:获取指定javabean对象的属性值
<jsp:getProperty name=“JavaBean实例名” property=“属性名”/>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'dologin.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty动作元素</h1>
<hr>
<!--根据表单自动匹配所有的属性 -->
<%--
<jsp:setProperty name="myUsers" property="*"/>
--%>
<!--根据表单匹配所有部分的属性 -->
<%--
<jsp:setProperty name="myUsers" property="username"/>
--%>
<!--根表单无关,通过手工赋值给属性 -->
<%--
<jsp:setProperty name="myUsers" property="username" value="lisi"/>
<jsp:setProperty name="myUsers" property="password" value="888888"/>
--%>
<!--通过URL传参数给属性赋值 -->
<jsp:setProperty name="myUsers" property="username"/>
<jsp:setProperty name="myUsers" property="password" param="mypass"/>
<!-- 使用传统的表达式方式来获取用户名和密码 -->
<%--
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
--%>
<!-- 使用getProperty方式来获取用户名和密码 -->
用户名:<jsp:getProperty name="myUsers" property="username"/> <br>
密码:<jsp:getProperty name="myUsers" property="password"/><br>
<br>
<br>
<a href="testScope.jsp">测试javabean的四个作用域范围</a>
<%
request.getRequestDispatcher("testScope.jsp").forward(request, response);
%>
</body>
</html>
-
Javabean的四个作用域范围
使用useBeans的scope属性可以用来指定javabean的作用范围page:当前页面有效,获取不到 request:用请求转发获取不到,可以用重定向服务器内部转发保证是同一次请求 session:会话,打开的是同一次会话,可以获取 application:作用范围最大
●page //仅在当前页面有效
●request //可以通过HttpRequest.getAttribute()方法取得JavaBean对象。
●session //可以通过HttpSession.getAttribute(方法取得JavaBean对象。
●applicatoin //可以通过application.getAttribute(方法取得Javabean对象
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="com.po.Users" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'testScope.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>Javabean的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
用户名:<jsp:getProperty name="myUsers" property="username"/><br>
密码:<jsp:getProperty name="myUsers" property="password"/><br>
<!-- 使用内置对象获取用户名和密码 -->
<hr>
<%--
用户名:<%=((Users)application.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
--%>
<%--
用户名:<%=((Users)session.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((Users)session.getAttribute("myUsers")).getPassword() %><br>
--%>
<%--
用户名:<%=((Users)request.getAttribute("myUsers")).getUsername()%><br>
密码:<%=((Users)request.getAttribute("myUsers")).getPassword() %><br>
--%>
<%
String username = "";
String password = "";
if(pageContext.getAttribute("myUsers")!=null )
{
username = ((Users)pageContext.getAttribute("myUsers")).getUsername();
password = ((Users)pageContext.getAttribute("myUsers")).getPassword();
}
%>
用户名:<%=username%><br>
密码:<%=password%><br>
</body>
</html>
-
Model1简介
●Model 1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。 ●弊端: 在界面层充斥着大量的业务逻辑的代码和数据访问层的代码, Web程序的可扩展性和可维护性非常差。 ●Javabean的出现可以使jsp页面中使用Javabean封装的数据或者调用Javabean的业务逻辑代码,这样大大提升了程序的可维护性。 
javaBeans既可以封装数据也可以封装业务逻辑的功能,由javaBeans去调用底层的数据库,执行数据访问层去调用底层数据库,把得到的结果呈现在jsp页面并显示给浏览器
JSP状态管理
-
http协议无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。简单地说,就是服务器不会去记得你,所以就是无状态协议。
因为http是无状态的协议 所以希望每次都保存用户的状态
-
保存用户状态的两大机制
Session
Cookie -
Cookie简介
Web服务器保存在客户端的一系列文本信息
(1)什么是Cookie?
Cookie就是在Web服务器保存在客户端的一系列文本信息,如判定注册用户是否已经登录网站、“购物车”的处理、视频网站会自动记录用户的浏览过的视频 、记住用户名和密码实现自动登录功能
(2)Cookie的作用
●对特定对象的追踪
●保存用户网页浏览记录与习惯
●简化登录
安全风险:容易泄露用户信息 -
Cookie的创建与使用
创建Cookie对象:Cookie newCookie = new Cookie(String key,Object value);
写入Cookie对象:response.addCookie(newCookie);
读取Cookie对象:Cookie[] cookies = request.getCookies();
-
Session与Cookie的对比
JSP指令和动作元素
-
include指令
语法:<%@ include file=“URL”%> -
include动作
语法:
<jsp:include page=“URL” flush=“true|false”/>
page 要包含的页面
flush 被包含的页面是否从缓冲区读取 -
include指令与include动作的区别
-
jsp:forward动作
语法:
<jsp:forward page=“URL” />
等同于:
request.getRequestDispatcher("/url").forward(request,response); -
jsp:param动作
语法:
<jsp:param name=“参数名” value=“参数值”>
常常与jsp:forword一起使用,作为子标签 -
jsp:plugin动作
说明:根据网络资料进行搜索学习理解整理 若有侵权联系作者
参考链接:JAVA遇见HTML——JSP篇