在网络应用程序中有两种基本的结构,即C/S和B/S,对于c/s程序分为客户机和服务器两层,把应用软件按照在客户机端(通常由客户端维护困难),通过网络与服务器进行相互通信。B/S结构却不用通知客户端安装某个软件,内容修改了,也不需要通知客户端进行升级。
但是B/S结构相较于C/S存在一定的不好,例如对于服务器的负担比较重,客户端界面不够丰富、快速响应不如C/S结构等。
在Web程序结构中,浏览器端和应用服务器端采用请求/响应模式进行交互
建立Web网站的最基本要求是为了能让客户通过http/https协议访问网站的页面。为了能通过http/nttps 协议访问网页,只需将网页放在服务器中运行。注意,此处所说的服务器是软件服务器,不是硬件服务器。Java系列的服务器有很多,例如Tomcat 、Resin,Jboss 、Weblogic 、WebSphere 等。本章以Tomcat 6.0为例来进行讲解。不过,值得注意的是,在安装Tomcat 6.0之前一定要保证安装了JDK5.0或其以上版本,并配置了环境变量(例如Path等)。
JSP将动态代码嵌入到静态的HTML中,从而动态的输出。JSP运行在服务端,能够对客户端展现内容、处理用户提交的表单数据。
HTML页面是静态页面,也是事先由用户写好放在服务器上,由Web服务器向客户端返送。JSP页面是由JSP容器执行该页面的java代码部分,然后实时生成的HTML页面,因此说它是服务器端动态页面。最大的区别就是Javascript源代码是被服务器发送到客户端,由客户端执行,因此在客户端可以看到JavaScript源代码;而java代码却不会。
JSP表达式
<%= 变量/返回值/表达式 %>
JSP程序段
<%java代码%>
变量必须要先定义后使用
JSP声明
JSP声明中可以定义网页中的全局变量。而且不存在需要先声明后使用的规则。即使用JSP声明可以在任何地方定义变量,实际开发中,还可以在JSP声明中定义方法、类的声明。语法如下:
<%! 代码 %>
重新学习JSP之三
JSP指令和动作
JSP动作是用XML语法格式的标记来控制服务器的行为,能够动态插入文件、将请求跳转到另外的页面、调用JavaBean组件等。其用法如下:
<jsp:动作名 属性1 = "属性值1" ... 属性n = "属性值n" />
//或者
<jsp:动作名>相关内容
</jsp:动作名>
使用include指令把另外的页面包含进本页面,但被包含的页面与本页面不能有相同的变量。
include动作
<jsp:include page = "文件名" />
或者
<jsp:include page = "文件名" >相关标签
</jsp:include>
page属性是需要包含进来的资源,但需要注意,include动作只会把文件中的输出包含进来。
includeMsg.jsp
<%@ page language = "java" pageEncoding = "gb2312" %>
<html><head><title>includeMsg</title></head><body><%String msg = "欢迎您来到教务管理系统!";%></body>
</html>
jspIncludeTest1.jsp
<%@ page language = "java" pageEncoding = "gb2312" %>
<html><head><title>includeMsg</title></head><body><jsp:include page = "includeMsg.jsp" /><%String msg = "本系统竭诚为您服务!";out.println(msg);%></body>
</html>
在includeMsg.jsp中定义了msg,jspIncludeTest1.jsp中也定义了msg,但是在includeMsg.jsp中没有输出。所以includeMsg.jsp不会被包含进来,所以再次定义msg是不会报错的。
JSP——表单开发
表单提交给服务器,可以用中的action属性
重新学习JSP之六——基本表单开发
重新学习JSP之七——同名表单元素和隐藏表单元素
重新学习JSP之八——JavaBean
重新学习JSP之九——基于表单的投票系统
重新学习JSP之九——JSP内置对象(上)
<%out.println("Hello World!" + "<br>");//必须要有<br>
%>
重新学习JSP之十——用Cookie保存登录信息
重新学习JSP之十一——JSP内置对象(下)
重新学习JSP之十二——在线交流系统
Servlet
是运行在Web服务器端的java应用程序,可以生成动态的Web页面,属于客户与服务器响应的中间层。实际上,JSP在底层就是一个Servlet。实际上,在运行JSP时,服务器底层会将JSP编译成一个Java类,这个类就是servlet。因此,可以说JSP就是servlet。二者可以实现同样的页面效果,不过编写JSP和servlet相比,前者的成本低的多。
一个普通的类不可能成为servlet,要想成为servlet还要完成以下步骤
Servlet采用的是多线程机制,每一次请求,系统都会分配一个线程来运行doGet()函数。但这也会带来安全问题,一般来说,不要在servlet内定义成员变量,除非这些成员变量是所有用户共用的。
重新学习JSP之十四——Servlet高级编程
重新学习JSP之十五——MVC模式
Day7_JavaWeb——Servlet的配置文件
过滤器
设置编码格式的代码:
request.setCharacterEncoding("gb2312");
那么每个JSP页面的内容有中文并且想获取这些内容,则都要写上上面的代码,这是一件很繁琐的事情。为此有人提出:在请求被处理之前,有一个公关的模块,专门负责进行编码的转换。
如何编写过滤器:只需要在web.xml中配置即可灵活重复使用,它能够对JSP、HTML、servlet进行过滤。
package filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class EncodingFilter implements Filter{public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubrequest.setCharacterEncoding("gb2312");//设置编码chain.doFilter(request, response);//将请求向下传递,如果没有这一句,过滤器收到请求进行处理之后,请求将不会传递给目标页面}
}
配置过滤器
我们可以为一个资源配置多个Filter,当配置多个Filter后会有一个执行顺序的问题,实际执行顺序是按照在web.xml文件中servlet-mapping的顺序决定的,如果顺序越靠前越先被调用。
在web.xml中加入:
<filter><filter-name>EncodingFilter</filter-name><filter-class>filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
过滤器的配置与Servlet相似。用于指定过滤模式。
过滤器dofilter()函数是在servlet被调用之前调用的
在大型项目中有时候会需要很多过滤器,如果每一个过滤器都需要在服务器进行实例化会带来很大的开销,导致启动速度较慢。
监听器——设计模式为观察者模式
HttpSessionEvent 不能直接调用getServletContext()
javaweb之监听器实现在线人数1
javaweb之监听器实现在线人数2
注册方式可以通过,xml的方式或者@WebListener注解来进行注册
发生在过滤器前
所有的监听器方法不需要我们去调用,服务器会进行调用。当某一个特殊事件发生的时候,服务器会自动调用。
类似JS事件: 被观察的对象发生某种情况的时候,自动触发代码的执行。
对域对象要发生的方法进行监听。
并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听。
HttpSession、ServletRequest 和 ServletContext 之间可以相互访问:
- 从 HttpSession 中,你可以通过 session.getServletContext() 方法获取
ServletContext。 - 从 ServletRequest 中,你可以通过 request.getSession() 方法获取 HttpSession,以及通过request.getServletContext() 方法获取 ServletContext。
ServletContext监听器:
ServletContextListener:监听整个Web应用的生命周期事件,如初始化和销毁。
ServletContextAttributeListener:监听ServletContext属性的添加、删除和替换事件。
HTTP会话监听器(Session域):
HttpSessionListener:监听HTTP会话的创建和销毁事件。
HttpSessionAttributeListener:监听会话属性的添加、删除和替换事件。
HttpSessionActivationListener:监听会话的被动激活和去激活事件。(绑定(将一个对象放入到session域中)与解绑(将这个对象从session域中移除)的监听器)
HttpSessionBindingListener:监听会话中属性的绑定和解绑事件。(钝化(session内存中的对象持久化(序列化)到磁盘)与活化(磁盘上的对象再次恢复到session内存中)的监听器)
请求监听器(Request域):
ServletRequestListener:监听请求的初始化和销毁事件。
ServletRequestAttributeListener:监听请求属性的添加、删除和替换事件。
组件监听器(Component域,如Servlet、Filter等):
ServletContextListener:监听ServletContext级别的事件,对所有组件都有效。
HttpSessionListener:监听会话级别的事件,对所有组件都有效。
Javaweb——监听器
【JavaWeb】监听器 Listener
重新学习JSP之十七——购物车
重新学习JSP之十八——EL
重新学习JSP之十九——JSTL
java接口Serializable的作用
package cn.ctgu.attribute.domain;import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;public class Person implements HttpSessionBindingListener{private String name;private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}//绑定方法,session将person对象添加的时候触发@Overridepublic void valueBound(HttpSessionBindingEvent event) {// TODO Auto-generated method stubSystem.out.println("person被绑定了");}//解绑方法,session将person移除掉的时候触发@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {// TODO Auto-generated method stubSystem.out.println("person被解绑了");}}
package cn.ctgu.attribute.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** Servlet implementation class TestPersonBindingServlet*/
@WebServlet("/TestPersonBindingServlet")
public class TestPersonBindingServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session=request.getSession();//将person对象绑定到session中Person p=new Person();p.setId(100);p.setName("zhangsanfeng");session.setAttribute("person",p);//将person对象从session中解绑session.removeAttribute("person");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
被钝化和活化的Customer类Customer.java
package cn.ctgu.attribute.domain;import java.io.Serializable;import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
//实现了Serializable接口才能被活化(序列化)
public class Customer implements HttpSessionActivationListener,Serializable{private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}//活化@Overridepublic void sessionDidActivate(HttpSessionEvent arg0) {// TODO Auto-generated method stubSystem.out.println("Customer被活化了");}//钝化@Overridepublic void sessionWillPassivate(HttpSessionEvent arg0) {// TODO Auto-generated method stubSystem.out.println("Customer被钝化了");}}
META-INF目录下的context.xml文件配置钝化路径以及钝化间隔时间
<?xml version="1.0" encoding="UTF-8"?>
<Context><!-- maxIdleSwap:session中的对象多长时间不使用就钝化 --><!-- directory:钝化后的对象的文件写到磁盘的哪个目录下 配置钝化的对象文件在 work/catalina/localhost/钝化文件 --><Manager className="org.apache.catalina.session.PersistentManager"maxIdleSwap="1"><!--这里的1表示1分钟,即session 1分钟不用的时候对象就会被钝化到磁盘 --><Store className="org.apache.catalina.session.FileStore"directory="C:\Users\Administrator\Desktop\Java\JavaWeb\Listener\SessionActivation" /><!--这里的directory表示session钝化后的存储路径 --></Manager>
</Context>
TestCustomerHttpSessionActivationListener.java
package cn.ctgu.attribute.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** Servlet implementation class TestCustomerHttpSessionActivationListener*/
@WebServlet("/TestCustomerHttpSessionActivationListener")
public class TestCustomerHttpSessionActivationListener extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session=request.getSession();//将customer放到session中,当服务器关闭的时候customer对象就会被钝化到磁盘中Customer customer=new Customer();customer.setId("200");customer.setName("lucy");session.setAttribute("customer", customer);System.out.println("customer被放到session域中");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
TestCustomerHttpSessionActivationListener2.java
package cn.ctgu.attribute.domain;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** Servlet implementation class TestCustomerHttpSessionActivationListener2*/
@WebServlet("/TestCustomerHttpSessionActivationListener2")
public class TestCustomerHttpSessionActivationListener2 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//从session域中获得customer,只有服务器重启的时候,session域中的被钝化的对象,才能从磁盘中活化过来被使用HttpSession session=request.getSession();Customer customer=(Customer)session.getAttribute("customer");System.out.println(customer.getName());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
【Java Web】Axios实现前后端数据异步交互