
- 外文名
- Java Server Pages
- 本 质
- JSP
- 中文名
- JAVA服务器页面
-
JSP
2017-04-10 14:50:42jsp简介 JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。 jsp: 作为请求发起页面,例如显示表单、超链接。 : 作为请求结束页面,例如显示数据。 ...jsp简介
- JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。
- jsp: 作为请求发起页面,例如显示表单、超链接。
: 作为请求结束页面,例如显示数据。 - Servlet:
作为请求中处理数据的环节。 - jsp的组成
- jsp = html + java脚本 + jsp标签(指令)
- jsp中可直接使用的对象一共有9个,被称之为9大内置对象
- 3种java脚本:
<%…%>:写java代码片段,(类似方法)
<%=…%>:用于输出,用于输出一条表达式(或变量)的结果。
<%!…%>:声明,用来创建类的成员变量和成员方法(类似与类) - jsp注释:<%– … –%>
当服务器把jsp编译成java文件时已经忽略了注释部分!
jsp原理(看源码)
- jsp其实是一种特殊的Servlet
- 当jsp页面第一次被访问时,服务器会把jsp编译成java文件
- 然后再把java编译成.class
- 然后创建该类对象
- 最后调用它的service()方法
- 第二次请求同一jsp时,直接调用service()方法。
jsp三大指令
page
<%@page language=”java” info=”xxx”…%>**
- pageEncoding和contentType:
pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding!
contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType(“text/html;charset=utf-8”);
如果两个属性只提供一个,那么另一个的默认值为设置那一个。
如果两个属性都没有设置,那么默认为iso - import:导包!可以出现多次
- errorPage和isErrorPage
errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定
isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
<error-page>有两种使用方式: <error-code>和<location>子元素; <exception-type>和<location>子元素; 其中<error-code>是指定响应码;<location>指定转发的页面;<exception-type>是指定抛出的异常类型。
<error-page> <error-code>404</error-code> <location>/error/errorPage.jsp</location> </error-page> <error-page> <exception-type>java.lang.RuntimeException</exception-type> <location>/index.jsp</location> </error-page>
- autoFlush和buffer
autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常!
buffer:指定缓冲区大小,默认为8kb,通常不需要修改! - isELIgnored:是否忽略el表达式,默认值为false,不忽略,即支持!
- (以下了解即可):
language:指定当前jsp编译后的语言类型,默认值为java。
info:信息!
isThreadSafe:当前的jsp是否支持并发访问!
session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
extends:让jsp生成的servlet去继承该属性指定的类!
include –> 静态包含
- 与RequestDispatcher的include()方法的功能相似!
- <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
- RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
- 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
taglib –> 导入标签库
- 两个属性:
prefix:指定标签库在本页面中的前缀!由我们自己来起名称!
uri: 指定标签库的位置!
<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法<s:text>
九大内置对象
- 在jsp中无需声明即可直接使用的9个对象
- out(JspWriter):等同与response.getWriter(),用来向客户端发送文本数据;
- config(ServletConfig):对应“真身”中的ServletConfig;
- page(当前JSP的真身类型):当前JSP页面的“this”,即当前对象,引用为Object类型;
- pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象;
- exception(Throwable):只有在错误页面中可以使用这个对象;
- request(HttpServletRequest):即HttpServletRequest类的对象;
- response(HttpServletResponse):即HttpServletResponse类的对象;
- application(ServletContext):即ServletContext类的对象;
- session(HttpSession):即HttpSession类的对象,不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。
- pageContext(一个顶9个!)
- Servlet中有三大域,而JSP中有四大域!
ServletContext:整个应用程序
session:整个会话(一个会话中只有一个用户)
request:一个请求链!
pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!
域对象
代理其他域:pageContext.setAttribute(“xxx”, “XXX”, PageContext.SESSION_SCOPE);
全域查找:pageContext.findAttribute(“xxx”);从小到大,依赖查找!
获取其他8个内置对象:
- Servlet中有三大域,而JSP中有四大域!
JSP动作标签
动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!
<jsp:include>
例如:<jsp:include page="xxx"/>
,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。
- 注意:
<jsp:include page="<%=myfile%>">
,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。 - 该标签内部使用的是RequestDispatcher#include()方法完成的包含
- 注意:
<jsp:forward>
例如:<jsp:forward page="xxx"/>,
用来转发到指定页面
例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/>
a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>
标签下面的内容不会被执行。<jsp:param>
该标签是和的子标签,用来向其他页面传递参数。
在b.jsp中可以使用request.getParameter(“username”)来获取参数值。<jsp:include page="/b.jsp"> <jsp:param value="zhangSan" name="username"/> </jsp:include>
javaBean
- 必须有public的无参的构造器
- 如果成员变量提供了getter/setter方法,那么称之为javabean属性。
JavaBean主要是用来通过反射操作的类!
因为需要通过Class的newInstance()方法来创建类的实例,所以要求类必须提供public的无参构造器内省
- 内省类 –> Bean信息 –> 属性描述符 –> 属性的get/set对应的Method! — > 反射
- 通过Class对象获取BeanInfo
BeanInfo info = Introspector.getBeanInfo(User.class); - 通过BeanInfo获取所有属性描述符对象
PropertyDescriptor[] pds = info.getPropertyDescriptors(); - PropertyDescriptor:
- String name getName():获取当前属性名称
- Method getReadMethod():获取get方法反射对象
- Method getWriteMethod():获取set方法反射对象
- 通过Class对象获取BeanInfo
- jar包 commons-beanutils.jar、commons-logging.jar
- 通过反射设置Javabean
Class<User>
clazz = User.class;
Object user = clazz.newInstance();
BeanUtils.setProperty(user, “username”, “admin”);
BeanUtils.setProperty(user, “password”, “admin123”); - 获取属性值
String username = BeanUtils.getProperty(user, “username”); - 把Map数据封装到JavaBean对象中
Map<String,String> map = new HashMap<String,String>(); map.put("username", "admin"); map.put("password", "admin123");
User user = new User();
BeanUtils.populate(user, map);要求:map的key名称必须与User类的属性名称相同。不要无法赋值!
JSP中与JavaBean相关的标签
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:useBean id="user1" class="cn.domain.User" />
查看page域中是否存在user1这个域属性,如果存在,那么直接获取。
如果不存在,那么创建之!
等同与:
User user1 = pageContext.getAttribute(“user1”);
if(user1 == null) {
user1 = new User();//创建user1对象
pageContext.setAttribute(“user1”, user1);//保存到page域
}- 可以通过scope属性来指定操作
设置属性值:
<jsp:setProperty property="username" name="user1" value="admin"/>
- name:指定名为user1的JavaBean
- property:指定要设置的属性名称
- value:指定要设置的属性值
等同与
User user1 = (User)pageContext.getAttribute(“user1”);
user1.setUsername(“admin”);
**<jsp:getProperty>**
获取属性值
<jsp:getProperty property="username" name="user1"/>
输出user1这个javaBean的username属性值
等同与
User user1 = (User)pageContext.getAttribute(“user1”);
out.print(user1.getUsername());EL表达式
- EL:Expression Language,它是可以在JSP页面中直接使用的语言!
JSP页面也可以忽略EL:<@page isELIgnored=”true”%>
EL用来代替<%=…%> - EL 11个内置对象
EL可以输出的东西都在11个内置对象中!11个内置对象,其中10个是Map!pageContext不是map,它就是PageContext类型,1一个顶九个
${p
ageScope.xxx}、${r
equestScope.xxx}、${s
essionScope.xxx}、${a
pplicationScope.xxx}- param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。
- paramValues:对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。
- header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头
- headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
- initParam:获取
<context-param>
内的参数!- cookie:
Map<String,Cookie>类型
,其中key是cookie的name,value是cookie对象。 ${cookie.username.value}- pageContext:它是PageContext类型!${pageContext.request.contextPath}
EL操作四大域的内置对象:它们是Map类型
pageScope
requestScope
sessionScope
applicationScope${pageScope.user}:输出pageContext.getAttribute("user") ${requestScope.user}:输出request.getAttribute("user"); ${sessionScope.user}:输出session.getAttribute("user"); ${applicationScope.user}:输出application.getAttribute("user");
${user}
依次在pageScope、requestScope、sessionScope、applicationScope中查找user
如果查找到,那么立刻停止查找。- 操作JavaBean
<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
pageContext.setAttribute(“user”, user);
%>
${pageScope.user.username} ${pageScope.user.password}
- 操作List
<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
List list = new ArrayList();
list.add(user);
pageContext.setAttribute(“list”, list);
%>
${pageScope.list[0].username} ${pageScope.list[0].password}
- 操作Map
<%
User user = new User();
user.setUsername(“zhangSan”);
user.setPassword(“123”);
Map map = new HashMap();
map.put(“u1”, user);
pageContext.setAttribute(“map”, map);
%>
${pageScope.map['u1'].username} ${pageScope.map['u1'].password} ${pageScope.map.u1.username} ${pageScope.map.u1.password}
EL操作参数内置对象:Map类型
param:Map<String,String> paramValues:Map<String,String[]> ${param.username}:request.getParameter("username") ${paramValues.hobby}:request.getParameterValues("hobby");
EL操作请求头内置对象:Map类型
header:Map<String,String> headerValues:Map<String,String[]> ${header.UserAgent} ${headerValues.UserAgener[0]
- 与Cookie相关的内置对象:Map类型
cookie:Map<String,Cookie>,其中key是Cookie的名称,而值是Cookie对象
${cookie.jsessionid.value}:获取sessionid
- pageContext内置对象:PageContext类型
${pageContext.request},等同pageContext.getRequest() ${pageContext.session},等同pageContext.getSession() ${pageContext.request.contextpath},获取项目名 ${pageContext.session.id},获取sessionId
- EL中最重要的就是操作四大域!
使用EL函数库需要在JSP页面中导入标签库:
导入标签库:<%@ tablib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions”%>
String toUpperCase(String input):把参数转换成大写
String toLowerCase(String input):把参数转换成小写
int indexOf(String input, String substring):从大串,输出小串的位置!
boolean contains(String input, String substring):查看大串中是否包含小串
boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含
boolean startsWith(String input, String substring):是否以小串为前缀
boolean endsWith(String input, String substring):是否以小串为后缀
String substring(String input, int beginIndex, int endIndex):截取子串
String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
String escapeXml(String input):把input中“<”、”>”、”&”、”’”、”“”,进行转义
String trim(String input):去除前后空格
String replace(String input, String substringBefore, String substringAfter):替换
String[] split(String input, String delimiters):分割字符串,得到字符串数组
int length(Object obj):可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator):联合字符串数组!
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> … String[] strs = {"a", "b","c"}; List list = new ArrayList(); list.add("a"); pageContext.setAttribute("arr", strs); pageContext.setAttribute("list", list); %> ${fn:length(arr) }<br/><!--3--> ${fn:length(list) }<br/><!--1--> ${fn:toLowerCase("Hello") }<br/> <!-- hello --> ${fn:toUpperCase("Hello") }<br/> <!-- HELLO --> ${fn:contains("abc", "a")}<br/><!-- true --> ${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true --> ${fn:contains(arr, "a")}<br/><!-- true --> ${fn:containsIgnoreCase(list, "A")}<br/><!-- true --> ${fn:endsWith("Hello.java", ".java")}<br/><!-- true --> ${fn:startsWith("Hello.java", "Hell")}<br/><!-- true --> ${fn:indexOf("Hello-World", "-")}<br/><!-- 5 --> ${fn:join(arr, ";")}<br/><!-- a;b;c --> ${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World --> ${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c --> ${fn:substring("0123456789", 6, 9)}<br/><!-- 678 --> ${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 --> ${fn:substringAfter("Hello-World", "-")}<br/><!-- World --> ${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello --> ${fn:trim(" a b c ")}<br/><!-- a b c --> ${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->
自定义函数库
- 写一个java类,类中可以定义0~N个方法,但必须是static,而且有返回值的!
- 在WEB-INF目录下创建一个tld文件
<function> <name>fun</name> <function-class>haha.fn.MyFunction</function-class> <function-signature>java.lang.String fun()</function-signature> </function>
- 在jsp页面中导入标签库
<%@ taglib prefix=”it” uri=”/WEB-INF/tlds/haha.tld” %> - 在jsp页面中使用自定义的函数:${it:fun() }
JSTL
- JSTL是apache对EL表达式的扩展
jstl标签库
- core:核心标签库,
- fmt:格式化标签库
- sql:数据库标签库,过时;
- xml:xml标签库,过时。
<c:core>
<c:out v
alue=”aaa”/> 输出字符串aaa<c:out value="${a
aa}”/> 输出域属性aaa,其中与${aaa}相同<c:out value="${aa
a}” default=”xxx”/>如果${aaa}不存在,那么输出xxx字符串- <
c:out value="${aaa}"
escapeXml=”true”/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击
<c:set>
<c:set
var=”a” value=”hello”/> 创建名为a,值为hello的域属性,范围:page<c:set
var=”a” value=”hello” scope=”session”/> 范围为session(page、request、session、application)
<C:remove>
<c:remove
var=”a”/> 删除名为a的域属性<c:remove
var=”a” scope=”page”/> 删除page域中名为a的域属性
<C:url>
<c:url v
alue=”/AServlet”/> 输出URL:/项目名/AServlet<c:url
value=”/AServlet” var=”url” scope=”page”/> 把生成的url保存到page域中,而不会输出- 子标签:
<c:param>,
用来给url后面添加参数,例如:
<c:url value="/index.jsp"> <c:param name="username" value="张三"/> <!--可以对参数进行url编码!!--> </c:url>
结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
* var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。
* scope:它与var一起使用,用来保存url。<C:if>
*
<c:if
test=”${条件}”> 当条件为true时执行标签体内容
hello
<c:choose>
<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>[if] <c:when test="${score >= 90 }">A级</c:when> <c:when test="${score >= 80 }">B级</c:when> <c:when test="${score >= 70 }">C级</c:when> <c:when test="${score >= 60 }">D级</c:when> <c:otherwise>E级</c:otherwise>[else] </c:choose>
<c:forEach>
<c:forEach var="i" begin="1" end="10"> ${i} </c:forEach>
属性:
* var:循环变量
* begin:设置循环变量从几开始。
* end:设置循环变量到几结束。
* step:设置步长!等同与java中的i++,或i+=2。step默认为1- 遍历集合或数组方式:
<% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>
- 遍历List
<% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("liSi"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>
- 遍历Map
<% Map<String,String> stu = new LinkedHashMap<String,String>(); stu.put("number", "N_1001"); stu.put("name", "zhangSan"); pageContext.setAttribute("stu", stu); %> <c:forEach var="item" items="${stu }"> <c:out value="${item.key }: ${item.value }"/><br/> </c:forEach>
- 循环状态
循环状态变量有如下属性:
* count:循环元素的个数
* index:循环元素的下标
* first:是否为第一个元素
* last:是否为最后一个元素
* current:当前元素<c:forEach items="${list }" var="ele" varStatus="vs"> ${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/> </c:forEach>
fmt库
<fmt:formatDate
value=”” pattern=”“>
value:指定一个Date类型的变量
pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss
<fmt:formatNumber
value=”${num1}” pattern=”0.00”>
保留小数点后2位,它会四舍五入!如果不足2位,以0补位!
<fmt:formatNumber
value=”${num1}” pattern=”#.##”>
保留小数点后2位,它会四舍五入!如果不足2位,不补位!
自定义标签(实现SimpleTag接口,即简单标签)
步骤:
1. 标签处理类:继承SimpleTagSupport类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write(“<p>Hello SimpleTag!</p>
“) ;
}
}标签描述符文件(tld)
/WEB-INF/tlds/haha.tld<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "> <tlib-version>1.0</tlib-version> <short-name>haha</short-name> <uri>http://www.haha.cn/tags</uri> <tag> <name>hello</name> <!--标签名称--> <tag-class>cn.haha.tag.HelloTag</tag-class> <!--标签处理类名称--> <body-content>empty</body-content> <!--标签体为空,即空标签--> </tag> </taglib>
- jsp页面中使用自定义标签
<%@ taglib prefix="it" uri="/WEB-INF/hello.tld" %> ...... <it:hello/>
有标签体的标签
标签处理类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
PageContext pc = (PageContext) this.getJspContext();
HttpServletRequest req = (HttpServletRequest) pc.getRequest();
String s = req.getParameter(“exec”);
if(s != null && s.endsWith(“true”)) {
// 获取标签体对象
JspFragment body = this.getJspBody() ;
// 执行标签体
body.invoke (null);
}}
}tld
<tag> <name>hello</name> <tag-class>cn.itcast.tags.HelloTag</tag-class> <body-content>scriptless</body-content> <!--标签体内容不可以是java脚本,但可以是el、jstl等--> </tag>
不执行标签下面的页面内容
public void doTag() throws JspException, IOException { this.getJspContext().getOut().print("<h1>只能看到我!</h1>"); throw new SkipPageException(); }
带有属性的标签
public class IfTag extends SimpleTagSupport {
private boolean test;//设置属性,提供getter/setter方法
public boolean isTest() {
return test;
}
public void setTest (boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {//如果test为true,执行标签体内容
this.getJspBody().invoke(null);
}
}
}<tag> <name>if</name> <tag-class>cn.haha.tag.IfTag</tag-class> <body-content>scriptless</body-content> <!--部署属性--> <attribute> <name>test</name> <!--属性名--> <required>true</required> <!--属性是否为必须的--> <rtexprvalue>true</rtexprvalue> <!--属性值是否可以为EL或JSTL等--> </attribute> </tag>
-
解决eclipse编辑jsp、js文件时,经常出现卡死的问题
2019-07-31 19:20:50使用Eclipse编辑jsp、js文件时,经常出现卡死现象,解决方法如下: 1、取消验证 windows–>perferences–>validation 把 除了manual 下面的全部点掉,build下只留 classpath dependency Validator。 其实...使用Eclipse编辑jsp、js文件时,经常出现卡死现象,解决方法如下:
1、取消验证
windows–>perferences–>validation
把 除了manual 下面的全部点掉,build下只留 classpath dependency Validator。
其实我是把所有的都给关了!
2、关闭拼写检查
windows–>perferences–>general–> editors->Text Editors->spelling
3、关闭js校验
在项目名上按alt+enter - 》Buliers 里面取消不需要的校验,一般都是js校验很慢,所以把JavaScript Validator前面的勾去掉。
4、修改项目的.project文件
eclipse中默认js编辑器非常慢,尤其在拷贝粘贴代码时,因为使用的是官网标准版的eclipse3.9 for javaEE未装任何插件,写JS时卡的简直无法忍受,尝试去掉所有的validate,包括菜单和项目属性中的都无作用,后来在项目根目录的.project文件中发现以下红色行居然Validator都还在,把红色对应的配置段全部删去后,问题解决,编辑JS再也不似蜗牛了.
<buildSpec>
<buildCommand>
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
<dictionary>
<key>LaunchConfigHandle</key>
<value><project>/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch</value>
</dictionary>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
<dictionary>
<key>LaunchConfigHandle</key>
<value><project>/.externalToolBuilders/org.eclipse.wst.validation.validationbuilder.launch</value>
</dictionary>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
-
JSP技术简介
2018-04-13 19:05:091 JSP技术的特征 JSP技术所开发的web应用程序是基于Java的,它拥有Java跨平台的特性,以及业务代码分离,组建重用,基础Java servlet功能和预编译功能。 1)跨平台 由于JSP是基于Java语言的,因而它可以使用Java...1 JSP技术的特征
JSP技术所开发的web应用程序是基于Java的,它拥有Java跨平台的特性,以及业务代码分离,组建重用,基础Java servlet功能和预编译功能。
1)跨平台
由于JSP是基于Java语言的,因而它可以使用Java的API,所以也是跨平台的,可以应用在Windows、Linux、Mac和Solaris。
2)业务代码分离
采用JSP开发的项目,通常使用HTML语言来设计和格式化静态页面内容,而使用JSP标签来实现动态部分,业务代码通常使用servlet、struts、springmvc等业务控制层来处理,从而实现业务层和视图层分离,这样,JSP只负责显示数据即可,这样,修改业务代码不会影响JSP页面代码。
3)组件重用
JSP中,可以使用JavaBean编写业务组件,也就是使用一个JavaBean封装业务处理代码或者作为一个数据处理模型,这个JavaBean可以重复使用,也可以应用到其他应用程序中。
4)继承Java servlet功能
JSP的本质是servlet,因此说JSP拥有servlet的所有功能。
5)预编译
用户首次通过浏览器访问JSP页面时,服务器对JSP页面代码进行编译,并且仅执行一次编译,编译后被保存,下次访问时直接执行编译过的代码,节约了服务器资源,提升了客户端访问速度。
2 JSP技术的原理
JSP的工作方式是请求/应答模式,客户端发出HTTP请求,JSP收到请求后进行处理,并返回处理结果。在一个JSP文件首次被请求时,JSP引擎首先把这个JSP文件转换成一个servlet,而该引擎本身也是一个servlet。运行过程如下:
1)JSP引擎首先把该JSP文件转换成一个Java源文件(servlet),在转换时,如果发现JSP文件中有任何语法错误,则中断转换过程,并向服务端和客户端输出错误信息。
2)如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件。
3)创建一个servlet(JSP页面的转换结果)实例,该servlet的jspInit()方法被执行,jspInit()方法在servlet生命周期中只调用一次。
4)用jspService()方法处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理。如果多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程来处理每个请求。由于该servlet始终驻留与内存,所以可以非常迅速的响应客户端的请求。
5)如果JSP文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将以编译结果取代内存中的servlet,并继续以上过程。
6)虽然JSP的效率很高,但首次调用时,由于需要转换和编译,会有一些轻微的延迟。此外,在任何时候,由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet中从内存中移去。在此情况下,jspDestroy()方法首先被调用,然后servlet实例将被回收。
在jspInit()中可进行一些初始化工作,如建立与数据库的连接或其他配置。
图2.1 JSP技术原理
如果喜欢本文可以关注下公众号,本人会定期推送一些学习资源及项目源码
-
jsp+servlet实现简单登录页面功能Demo
2018-05-28 17:55:161 [转载请联系本人]实现功能:模拟简单登录功能,登录成功跳转新页面,登录失败在原登录界面提示登录失败信息开发环境:eclipseTomcat-8.0预备知识:HTML标签,Servlet相关知识——请求的转发与重定向,jsp相关知识...小白新路历程-1
实现功能:
模拟简单登录功能,登录成功跳转新页面,登录失败在原登录界面提示登录失败信息
开发环境:
eclipse
Tomcat-8.0
预备知识:
HTML标签,Servlet相关知识——请求的转发与重定向,jsp相关知识,EL表达式
思路实现:共2个jsp,一个servlet
1.登录界面login.jsp:
采用jsp,不采用html的原因是因为要进行登录失败信息回显(当然如果用html结合ajax也可以实现,这里采用jsp更方便)
如图:
2.登录成功界面hello.jsp:
欢迎信息+登录的用户名
如图:
3.登录失败信息回显Login.jsp:
如图:
思路简述:
问题1:jsp页面如何与一个java类进行连接绑定起来?
简单的说,一个jsp页面要跟一个servlet进行连接,需要有一个桥梁,这个桥梁就是web.xml文件,可以通过下面代码观察到,登录页面的表单的提交的action属性值,填写的就是在web.xml文件里对应的servlet-mapping中的url-pattern的值,而这个值又对应了一个servlet-name,servlet-name则对应到一个servlet-class,这样就把jsp和java类(servlet类)进行了关联。
其实我觉得最明显的就是提交表单后,url地址变化了,通过这个url地址将表单信息传给了对应的java类。问题2:实现的整体的思路是怎么样的?
一个jsp页面通过表单元素,将用户信息通过url的形式提交给一个已经在web.xml配置映射好的servlet类,servlet类接收到传来的表单信息,进行值校验(为了方便起见则直接定义用户名密码了,正常情况下是要采用jdbc进行从数据库中取出值进行校验的),然后对校验结果进行判断,如果账户密码正确,则跳转到登录成功的页面(采用重定向),如果失败,则将登录失败的提示信息存到request域对象中并返回登录界面显示出来(采用请求的转发)
简单的联系:
jsp页面<---------->web.xml<--------->servlet类
问题3:在servlet中要如何获取jsp中提交过来的表单信息呢?
request.getParameter("userName");//userName是表单中,input标签中name属性的值,接收到的是string类型
问题4:登录页面如何在登录失败的时候给出提示信息呢?
实现思路是如果登录失败,则往request域对象中存入登录失败的提示信息,然后通过请求的转发的方式跳转回登录页面并显示,所以登录界面要嵌入一段脚本代码,用来判断当前是否有登录失败提示信息的对象,如果有则将该对象保存的信息打印出来,如果没有则什么都不显示。
1)如果账密不匹配,则往request域中存入message对象,该message中保存了提示信息:request.setAttribute("message", "账密错误,请重新登录<br>");
并转发到登录页面:request.getRequestDispatcher("/loginDemo/login.jsp").forward(request, response);
2)在登录页面获取该对象:(因为登录失败的时候才有该对象,疑问:那如果我登录失败后再访问登录页面,那不应该会显示错误信息吗?答案是否定的。可了解request域对象生命周期相关知识)
<%
if(request.getAttribute("message")!= null){
out.print(request.getAttribute("message"));
}
%>
问题5:request.getAttribute()和request.getParameter()区别是:
前者获取的是一个object对象,后者获取的是一个string字符串,所以前者使用的时候可能会碰到需要做一些类型转换的情况。
问题6:表单访问路径填写问题
在ation属性,或者请求的转发,重定向,一般采用绝对路径,可以避免路径访问出错,访问资源不存在等问题。
jsp表达式:<%=request.getContextPath()%>或者用EL表达式:${ pageContext.request.contextPath }可以获取当前web应用根目录路径,不妨试试输出打印下,就可以观察值是多少了。
具体代码Code:
1.login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>标题</title> <style type="text/css"> *{margin: 0;padding: 0;} form{margin: 0 auto;padding:15px; width: 300px;height:300px;text-align: center;} #submit{padding: 10px} #submit input{width: 50px;height: 24px;} </style> </head> <body> <div class="wrapper"> <form action="<%=request.getContextPath()%>/loginDemo" method="post"> <label>用户名:</label> <input type="text" name="userName" value="${param.userName}"/><br><br> <label>密码:</label> <input type="password" name="password"/><br> <font color="red"> <% if(request.getAttribute("message")!= null){ out.print(request.getAttribute("message")); } %> </font> <div id="submit"> <input type="submit" value="登录"/> </div> </form> </div> </body> </html>
2.hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>标题</title> </head> <body> Hello:<br> <font color="green" size="22"> <% out.print(request.getParameter("userName")+"<br>"); %> </font> <a href="<%=request.getContextPath()%>/loginDemo/login.jsp">重新登录</a> </body> </html>
3.对应的LoginServlet.java
package loginDemo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("userName"); String password = request.getParameter("password"); System.err.println(userName+";"+password); String myUser = "Dong"; String myPwd = "5432100"; if(userName.equals(myUser)&&password.equals(myPwd)) { response.sendRedirect(request.getContextPath()+"/loginDemo/hello.jsp?userName="+userName); }else { request.setAttribute("message", "账密错误,请重新登录<br>"); request.getRequestDispatcher("/loginDemo/login.jsp").forward(request, response); } } }
4.对应的web.xml的配置(注册)与映射
<servlet> <servlet-name>logindemo</servlet-name> <servlet-class>loginDemo.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>logindemo</servlet-name> <url-pattern>/loginDemo</url-pattern> </servlet-mapping>
留言Message:本人小白,以上仅个人学习心得,欢迎评论区dd,有错误欢迎指出,互相学习,感谢~
-
jsp相对路径
2020-05-31 21:06:37jsp相对路径文件:base.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String baseUrl = request.getScheme()+"://"+request.getServerName()+":"+... -
SpringBoot【整合JSP】
2019-05-12 21:56:48SpringBoot中默认是不支持jsp的,但是我们某些情况下可以又需要用到,所以本文记录下SpringBoot整合jsp的过程 整合JSP页面 1.创建控制器 创建一个自定义的控制器,处理请求,并跳转到jsp页面 /** * @... -
JSP 教程
2018-06-16 10:00:14转载自 JSP 教程JSP 教程JSP 教程JSP 简介JSP 开发环境搭建Eclipse JSP/ServletJSP 结构JSP 生命周期JSP 语法JSP 指令JSP 动作元素JSP 隐式对象JSP 客户端请求JSP 服务器响应JSP HTTP 状态码JSP 表单处理JSP 过滤器... -
javaweb04_JSP(Java Server Pages)
2020-09-21 10:30:26javaweb04_JSP(Java Server Pages) JSP入门: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <!DOCTYPE html> <html> <... -
jsp中文乱码现象解决办法
2018-04-04 15:49:35之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因。这次正好作下总结,中文乱码就是因为编码不符,可能出现乱码有四个地方:1 JSP编码乱码2 HTML编码乱码3 request获取数据乱码4 ... -
jsp网上商城jsp课程设计
2017-09-18 16:46:44演示地址:http://119.29.142.195/webshop/home.jsp代码仅供参考!!!仅供参考!!!com.webshop.dao.impl包 BaseDao.java中的连接数据库如下代码请自行修改private final static String URL = "jdbc:mysql://... -
springboot返回html和jsp
2018-07-04 09:32:04一、返回html(1)添加maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf...(2)thymelea... -
通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中
2018-06-14 13:57:28①安装java和tomcat,建立JSP网页最基础的软件 ②安装MySQL数据库(下载地址:https://www.mysql.com/) ③安装Navicat Premium来查看数据库中的表 ④下载JDBC驱动:mysql-connector-java-5.1.44-bin.jar... -
浅谈jsp、freemarker、velocity区别
2013-11-18 13:51:37听说jsp要淘汰,也不知道是真是假,但本人还是比较喜欢jsp的,下面是网上查找的javaweb项目页面3种技术的区别。 在java领域,表现层技术主要有三种:jsp、freemarker、velocity。 jsp是大家最熟悉的技术 优点: 1... -
【Java学习】JSP + Servlet + JDBC + Mysql 实现增删改查
2018-04-24 20:56:24Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持...JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。 Servlet和JSP最主... -
JSP中使用JSP模板
2017-05-13 20:25:24JSP中使用JSP模板使用模板是开发稍大一点的网站必不可少的一步,模板引擎也是有好多。因为接触的少,我还是选择了使用JSP做模板引擎,然后就是如何引入了。 JSP的include分两种,静态inclued和动态include,二者... -
JSP标签,jsp:include,jsp:forward用法介绍及示例
2019-03-04 22:53:18JSP标签概念action元素XML元素标准Action元素JSP标签&lt; jsp:include&gt;标签动态引入语法&lt; include&gt;和&lt; jsp:include&gt;的区别&lt; jsp:... -
JSP入门及JSP三种脚本
2018-10-26 20:07:181.JSP概述 1.什么是JSP 2.JSP的组成 2.JSP语法 1.JSP脚本 2.内置对象out 3.多个<%...%>可以通用 3.JSP的原理 1.JSP是特殊的Servlet 2.JSP真身存放目录 4.再论JSP脚本 5.JSP注释 0.码仙... -
JSP——编写三个JSP页面,main.jsp、circle.jsp和ladder.jsp,将三个JSP页面保存在同一个Web服务目录中,
2019-04-03 14:36:05编写三个JSP页面,main.jsp、circle.jsp和ladder.jsp, 将三个JSP页面保存在同一个Web服务目录中, main.jsp使用include动作标记加载circle.jsp和ladder.jsp页面。 circle.jsp页面可以计算并显示圆的面积,ladder... -
JSP学习——Eclipse自定义JSP模板(修改默认JSP文件)
2018-09-14 18:51:13第一步: Help->Preferences 第二步: 输入jsp-&...选择描述是:JSP “with html 5 markup”的模板,因为这个是创建JSP文件时选取的默认JSP模板 ...也可以在上图上new一个新的jsp模板,然后... -
jsp引入头部.jsp和尾部.jsp
2018-06-24 15:10:53在顶部<%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+...head.jsp"%>中间代 -
使用JSP
2018-04-30 22:08:31你写的JSP最终会变成一个servlet在Web应用中运行。它与其他servlet非常相似,只不过这个servlet类会由容器为你编写。容器拿到你在JSP中写的代码,把这些代码转换为一个servlet类源文件,然后再把这个源文件编译为... -
JSP——编写3个页面,实现登录页面login.jsp,在其中输入用户名,密码,发送到登录验证页面loginCL.jsp,...
2019-04-12 13:48:24编写3个页面,实现登录页面login.jsp,在其中输入用户名,密码,发送到登录验证页面loginCL.jsp,验证登录成功,在success.jsp页面显示成功...用户如果直接访问loginCL.jsp或success.jsp,均转向login.jsp页面。 注... -
jsp基础
2017-07-27 19:50:591、jsp基础 4.1 Jsp引入 Servlet的作用: 用java语言开发动态资源的技术!!! Jsp的作用: 用java语言(+html语言)开发动态资源的技术!!! Jsp就是servlet!!! 4.2 Jsp的特点 1)jsp的运行必须... -
JSP 简介
2018-02-03 11:49:36JSP 简介 JSP 与 PHP、ASP、ASP.NET 等语言类似,运行在服务端的语言。 JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成... -
JSP特点
2017-07-26 13:30:511.JSP文件必须在JSP服务器内运行。 2.JSP文件必须生成servlet才能执行。 3.JSP页面的第一个访问者速度慢,因为需要编译生成Servlet。 4.JSP不需要专门的客户端,也不需要java运行环境,因为JSP输出到页面是标准的... -
JSP网站后台管理系统
2012-01-11 03:48:30JSP网站后台管理系统,一款十分有用的后台管理模板,希望对大家有用 -
JSP教程 JSP教程 JSP教程 JSP教程 JSP教程 JSP教程
2007-11-04 22:48:00JSP教程 JSP教程 JSP教程 JSP教程 JSP教程 JSP教程 http://www.w3.org/TR/html4/loose.dtd">字号演示int i;for(i=1;i{%>">JSP教程}%> -
jsp简介
2017-05-21 15:04:03JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合... -
JSP ——编写两个JSP页面inputString.jsp和computer.jsp,用户可以使用inputString.jsp提供的表单输入一个...
2019-04-15 21:02:27编写两个JSP页面inputString.jsp和computer.jsp,用户可以使用inputString.jsp提供的表单输入一个字符串,并提交给computer.jsp页面,该页面通过内置对象获取inputString.jsp页面提交的字符串,计算并显示该字符串的...
-
2021最新Kubernetes(k8s)集群实战精讲
-
CUDA_VISIBLE_DEVICES
-
PS2018 X64bit(百度网盘).txt
-
python 如何读入excel数据
-
excel-VBA商品报价单.xlsm
-
Unity Third Person Controller代码解析
-
EIA-364-27C: 电子连接器和插座的机械冲击(特定脉冲)测试程序-完整英文版(18页)
-
RPG黑暗之光项目(源码)
-
uml统一建模语言 类图符号教程.带折角的矩形,空心三角形,空心圆,实线,虚线,关联,联系.zip
-
PLECS平台锁相环仿真模型PLL.plecs.rar
-
【数据分析实战训练营】Hive详解
-
【数据分析-随到随学】数据可视化
-
MarkdownPad2 不显示插入图片
-
AntennaHome Launch 5G Combo Internal PCB Antenna /5G 全频 PCB天线
-
电子设计报告.docx
-
关系抽取NYT数据集(BIO格式).zip
-
ProBuilder快速原型开发技术
-
Redis数据库入门与使用
-
MusicTools v1.9.2.0.zip
-
SubstancePainter插件开发-基础入门