技术标签: java servlet jsp 【web开发】 java web
servlet与JSP区别与联系
Hello World程序
servlet生命周期:首次创建servlet时,它的init方法会得到调用,因此,init是放置一次性设置代码的地方。在这之后,针对每个用户请求,都会创建一个线程,该线程调用前面创建的实例的service方法。多个并发请求一般会导致多个线程同时调用service。之后,由service方法依次接收到的HTTP请求的类型,调用doGet,doPost,或其他doXxx方法。最后,如果服务器决定卸载某个servlet,它会首先调用servlet的destroy方法。
更多servlet知识
session和servletContext的比较,Servlet实现访问次数的例子
Servlet的多线程和线程安全
<%= Java Expression %>
<% Java Code %>
<%! Field/Method Declaration %>
page
:允许我们通过类的导入、servlet超类的制定、内容类型的设置、以及诸如此类的事物来控制servlet的结构。<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="package.NameBean" %> //import:导入相应的包
-include
指令允许我们在JSP文件转换到servlet时,将一个文件插入到JSP页面中。include指令应该放在文档希望插入文件的地方。
区别
forward
方法与response.sendRedirect
区别forward | sendRedirect |
---|---|
控制的转移完全在服务器上进行。不涉及任何网络数据,等价于 <jsp:forword page="<%= destination %>" /> |
控制的转移通过向客户发送302状态代码和Location响应报头来完成。转移需要另外的网络往返 |
用户不会看到目的JSP页面,而且,我们还可以将页面放在WEB-INF中,防止用户在不经过建立数据的servlet,直接访问这些页面。如果JSP页面只在由servlet生成的数据的上下文中才有意义,则更应该这样做 | 用户能够看到目的页面的地址,并可以记录下来独立访问。如果将JSP设计为数据缺失时使用默认值,这种方式比较适用。例如,重新显示不完全的HTML表单,或汇总购物车的内容是,就会用这种方式。所有的情况下,之前创建的数据都可以从用户中的会话提取出来,甚至对于不涉及servlet的请求,这些JSP页面也有意义 |
//servlet代码片段
ValueObject value = new ValueObject(...);
request.setAttribute("key", value);
String destination = "/WEB-INF/SomePage.jps";
RequsetDispatcher dispatcher = request.getRequestDispatcher(destination);
dispatcher.forward(reqest, response);
//sendRedirect
response.sendRedirect("/WEB-INF/SomePage.jps");
<jsp:useBean id="beanName" class="propertyName" scope="page,request,session,application" />
<jsp:getProperty name "beanName" property="propertyName" value="propertyValue" />
<jsp:setProperty name="beanName" property="propertyName" value="propertyValue />"
分类 | 基于Java的定制标签 | 基于JSP的定制标签 |
---|---|---|
创建方式: | 标签处理类,该类定义标签的行为 | 创建基于JSP的标签文件 |
TLD文件,用于将XML元素名称映射到标签实现 | 创建一个使用标签文件的JSP的页面 | |
使用标签库的JSP文件 | ||
两者的区别: | 1、类似于servle与JSP的区别 |
使用JSP标准标签库(JSTL)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
// 定义bean: ValueObject
//servlet
ValueObject value = new ValueObject(...);
request.setAttribute("keY", value);
//HttpSession session = request.getSession();
//session.setAttribute("key", value);
RequestDispater dispatcher = request.getRequestDispatcher("/WEB-INF/SomePage.jsp");
dispatcher.forward(request,response);
//jsp
<jsp:useBean id="key" type="propertyName" scope="request" /> //session
<jsp:getProperty name="key" property="propertyName" />
//基于应用的数据共享
//servlet
synchronized(this) {
ValueObject value = new ValueObject(...);
getServletContext.setAttribute("keY", value);
RequestDispater dispatcher = request.getRequestDispatcher("/WEB-INF/SomePage.jsp");
dispatcher.forward(request,response);
}
//jsp
<jsp:useBean id="key" type="propertyName" scope="application" /> //session
<jsp:getProperty name="key" property="propertyName" />
${expression}
${name}
:在PageContext、HttpServletRequest、HttpSession、ServletContext作用域中依次查找。//访问实例对象customer的firstName属性
//JSP Expression Language 通过反射实现
${customer.firstName}
//显式Java语法
<%@ page import="package.NameBean" %>
<%
NameBean person = (NameBean)pageContext.findAtrribute("customer");
%>
<%= person.getFirstName() %>
//JSP脚本元素
<jsp:useBean id="customer" type="packege.NameBean" scope="request,session or application> />
<jsp:getProperty name="customer" property="firstName" />
从bean中提取数据时使用<jsp:useBean ... type="package.Class" />
代替<jsp:useBean ... class="package.Class" />
,从而避免JSP页面创建对象。
引用隐式对象:pageContext、param、header、cookie、initParam
pageScope、requestScope、sessionScope、applicationScopy
难免疏忽出错,有问题请留言
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数