什么是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出现闪退”文章。
出现闪退的原因有多个:
使用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是黑色的 有点难看。。。
之后,发布并启动服务器
JSP:java server page,与servlet一样,在服务器端执行
Jsp:Java平台,安全性高,适合开发大型的,企业级的Web应用程序。
Asp.net:.Net平台,安全性以及跨平台性差
Php:简单,高效,成本低开发周期短,适合中小型企业的Web应用开发。
LAMP:Linux + Apache + MySQL + PHP
<!-- HTML注释 客户端不可见 -->
<%-- JSP注释 客户端不可见 --%>
<%
//单行注释
/*多行注释*/
%>
pagez指令:通常位于jsp页面的顶端,同一个页面可以有多个page指令
include指令:将一个额外补文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句
taglib指令:使用标签库定义新的自定义标签,在JSP页面中启用定制行为
jspService()方法被调用来处理客户端的请求。对每一个请求, JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应-个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步问题,由于该Servlet始终驻于内存,所以响应是非常快的。
JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象。
<%
int[] value = {60,70,80};
for(int i:value){
out.println(i);
}
%>
缓冲区:Buffer,所谓缓冲
区就是内存的一块区域用来保存临时数据。
例子:
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("response内置对象
");
out.println("
");
//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实际上是- 一个特定的时间概念
●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", "[email protected]");
%>
所在城市是:<%=application.getAttribute("city") %><br>
application中的属性有:<%
Enumeration attributes = application.getAttributeNames();
while(attributes.hasMoreElements())
{
out.println(attributes.nextElement()+" ");
}
%><br>
JSP(SERVLET)引擎名及版本号:<%=application.getServerInfo() %><br>
</body>
</html>
JavaBean简介
Javabeans就是符合某种特定的规范的Java类。使用Javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性。
Jsp中如何使用Javabean
什么是JSP动作?
JSP动作元素( action elements ) ,动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。
jsp:useBeans
作用:在jsp页面中实例化或者在指定范围内使用javabean
【property = " * " 】根据名称进行匹配,根据表单提交过来的所有参数的名字和javaBeans中的属性名字来进行匹配,匹配上则自动赋值
【property = " javaBean属性名 " 】对部分属性进行匹配,指定的属性名字和表单传过来的属性名字进行匹配
只匹配了用户名 没有匹配密码 所以密码为空
【property = " javaBean属性名 " value = “BeanValue”】把value值传递给属性 表单传递的值时没有效果的 又被人为手工设置了新的值
【property = " propertyName " param = “request对象中的参数名” 】跟request参数关联 不一定是表单传递过来的参数 可以使url地址传递过来的参数
<%@ 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的业务逻辑代码,这样大大提升了程序的可维护性。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020062722271813.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjU1NjAy,size_16,color_FFFFFF,t_70)
javaBeans既可以封装数据也可以封装业务逻辑的功能,由javaBeans去调用底层的数据库,执行数据访问层去调用底层数据库,把得到的结果呈现在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();
include指令
语法:<%@ include file=“URL”%>
include动作
语法:
page 要包含的页面
flush 被包含的页面是否从缓冲区读取
jsp:forward动作
语法:
等同于:
request.getRequestDispatcher("/url").forward(request,response);
jsp:param动作
语法:
常常与jsp:forword一起使用,作为子标签
jsp:plugin动作
说明:根据网络资料进行搜索学习理解整理 若有侵权联系作者
参考链接:JAVA遇见HTML——JSP篇