JSP运行于服务器端而JavaScript运行于客户端吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP运行于服务器端而JavaScript运行于客户端吗?相关的知识,希望对你有一定的参考价值。

请高手指点!
多谢!

jsp一般是运行在服务器端的 经过服务器处理后,生成html文件传回客户端

js是运行在客户端的,你可以通过编写如下代码实现在服务器段编写JS代码:
<%
out.print("<script type=text/javascript>");
out.print("aler(\"hello~\")");

out.print("</script> ");
%>
参考技术A JSP严格说来是运行在客户端的,仅当它中含有JAVA代码时,JAVA代码运行在服务端,其它的JSP中的HTML代码运行在客户端.JavaScript一般运行在客户端 参考技术B

不过也可以javascript也可以在服务器端运行
参考技术C 客户端

JSP

一、JSP介绍

JSP:页面文件,动态页面。

JSP:JAVA Server Page,是服务器端一种基于JAVA语言的网页技术,所有程序操作都是在服务端执行,网络上传送的仅仅是运行的结果。运行的结果与浏览器无关,但是发送的结果在不同浏览器展示的效果有差别。

HTML+CSS+JAVASCRIPT+JAVA+JSP标签==JSP

二、JSP原理

假如目前浏览器发送一个请求,

http://localhost:9000/project_120_0010_cookie/login.jsp。

如果是第一次向该JSP发送请求,如果页面地址不正确,将会报404错误。如果页面地址正确,那边会将该JSP转换为Servlet,然后对其进行编译。【因此第一次加载该页面会相对较慢,但是以后打开会很快。】

转换的Servlet将会对请求的信息进行响应,响应的结果为HTML文本。

 

JSP和Servlet区别:

唯一区别是JSP在第一次请求会编译为Servlet,其实JSP实质上就是一个Servlet。

三、JSP页面构成

 

v 静态内容

HTML文本、CSS样式、JAVASCRIPT客户端验证脚本

v 指令

指令不会再客户端产生任何的输出,是在服务器解释并执行的。最要用于对JSP页面进行转换,它只在当前页面设置有效。

<%@ page language="java" %>

<%@ 指令名称  属性=属性值 .... %>

 

指令名称:

Pageincludetaglib[JSTL]

 

① Page

Page指令通常称为页面指令,可以定义在当前整个JSP页面范围的有效属性。

ü Language

当前编写JSP所使用的语句,目前只能为JAVA

ü Import

用于向当前JSP页面导入所需要的包和类名【类的路径】

格式:

import="java.util.*":表示util包下的所有类

import="java.util.*,java.a.A":表示util包下的所有类,以及A

 

默认导入包:

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.util.*;

【从Work文件夹下查找到对应的类文件。

 

ü pageEncoding

用来设置JSP页面的字符编码

ü contentType

设置页面响应的MIME

<%@ page  language="java" 

import="java.util.*" 

contentType="application/msword; charset=utf-8"%>

<table>

<tr>

<td>123</td>

<td>123</td>

</tr>

</table>

 

ü Session

设置当前页面是否支持Session,默认是true

ü isThreadSafe

是否线程安全,默认为true。表示会已多线程的方式处理用户请求。

如果设置为false,会阻塞其它浏览器打开页面。

ü isELIgnored

表示EL表达式是否禁止,默认为false

ü isErrorPage

表示是否为错误页面。

 

ü errorPage

表示错误页面,当当前页面有错误的时候跳转到指定的错误页面。

<%@ page language="java" import="java.util.*" 

pageEncoding="UTF-8" errorPage="word.jsp"%>

<%

int i = 5/0 ; 

%>

 

<%@ page isErrorPage="true"  language="java" 

import="java.util.*" pageEncoding="utf-8"%>

有错误

<%=exception.getMessage() %>

注意:如果要使用exception对象,需要设置isErrorPage为true

 

② Include

用于页面包含。

<%@ include file="head.html" %>

其实质将两个页面合并为一个Servlet

与动作方式的包含本质区别在于是否合并为一个Servlet

<jsp:include page="head.html"></jsp:include>

另外包含的文件可以为HTMLJSP、文本文档等。

另外file属性对应的路径可以为绝对路径以及相对路径。

 

③ Tablib

后面讲述,JSTL

 

v 表达式

<%=   %>

v 注释

<%-- --%>  该注释方式为JAVA注释方式,页面源代码看不到,展示页面看不到

<!-- 你好 -->该注释方式为HTML注释方式,页面源代码能看到,展示页面看不到

 

v 声明

格式:<%! int i = 6 ; %>

定义属性:

定义方法:

<%!

   int i = 6 ; 

  

    String hello(String person){

     return "你好"+person;

    }

  %>

<%=hello("120") %>

 

v 动作

后面讲述

 

作业:向JSP发送请求,打印倒三角形。例如输入5,那么打印5行倒三角形。

四、JSP内置对象

 

 

pageContextJSTL中使用。能找到任何的内置对象。

Page相当于this对象,反映的是当前JSP转换为Servlet的对象。

Exception需要在页面中定义了指令的属性isErrorPage属性为true

Config获取配置信息。

<%=config.getServletContext().getInitParameter("as") %>

 

<servlet>

   <servlet-name>test</servlet-name>

   <jsp-file>/sjx.jsp</jsp-file>

   <init-param>

   <param-name>ss</param-name>

   <param-value>123</param-value>

   </init-param>

  </servlet>

  

  <servlet-mapping>

   <servlet-name>test</servlet-name>

   <url-pattern>/sjx1.jsp</url-pattern>

  </servlet-mapping>

<%=config.getInitParameter("ss") %>

 

五、JSP动作JAVABEAN

JAVABEAN是一个封装了业务逻辑的可重用组件,包括可视化组件以及封装业务逻辑的组件。例如:分页

Model 1: JSP + JAVABEAN  

Model 2:  JSP  + SERVLET + Service + Servlet + JSP  MVC

 

v JAVABEAN构造

1.构造对象

<jsp:useBean id="g" class="vo.Goods"></jsp:useBean>

|

Goods g = new Goods();

 

2.设置属性值

<jsp:setProperty property="name" name="g1" value="234"/>

|

g.setName("123");

 

3.获取属性值

<jsp:getProperty property="name" name="g1"/>

g1.getName()

 

4.设置参数值

<jsp:useBean id="g1" class="vo.Goods"></jsp:useBean>

     <jsp:setProperty property="name" name="g1"

 value="<%=request.getParameter("name") %>"/>

     <jsp:setProperty property="count" name="g1"

 value="<%=Integer.parseInt(request.getParameter("count")) %>"/>

     <jsp:getProperty property="name" name="g1"/>

     <jsp:getProperty property="count" name="g1"/>

     <hr/>

     <jsp:useBean id="g2" class="vo.Goods"></jsp:useBean>

     <jsp:setProperty property="name" name="g2" param="name"/>

     <!-- g2.setName(request.getParameter("name")) -->

     <jsp:setProperty property="count" name="g2" param="count"/>

     <jsp:getProperty property="name" name="g2"/>

     <jsp:getProperty property="count" name="g2"/>

 

5.设置生效范围

其值:page、application、request、session

 

作业:

1.练习课堂上的知识

2.写一个组件,用于打印对应的SQL语句中的数据。

<jsp:useBean id="db" class="javabean.EmpJavaBean" scope="page" ></jsp:useBean>

     <jsp:setProperty property="sql" name="db"

 value="select * from emp" />

     <%

     List<Emp> emps = db.getList();

     out.print(emps.get(0).getEname());

     %>

 

public class EmpJavaBean {

 

private IEmpDao dao = new EmpDaoImpl();

 

private String sql ;

 

private List<Emp> list ; 

 

public String getSql() {

return sql;

}

 

public void setSql(String sql) {

this.sql = sql;

}

 

public List<Emp> getList() {

list = dao.listTables(sql);  //访问数据库

return list;

}

 

}

 

v JAVABEAN要求

1.必须得有一个无参的构造方法

2.提供属性的接口,使用set/get方法

3.最好实现序列化接口

 

v 分页

public class Page {

 

private int pageNo; // 当前第几页

 

private int pageSize; // 每页多少条数据

 

private int totalPages;// 总共多少页

 

private int totalResults;// 总共多少记录

 

private int defaultPageSize = 10;

 

private List<?> results;// 分页之后的结果

 

private String pageSQL = "";// 分页的SQL语句

 

private String sqlCount = "";// 获取总共多少条数据

 

private String clazz ;

 

private String html;

 

public void setClazz(String clazz) {

this.clazz = clazz;

}

 

public String getHtml() {

this.html = "<div id=\"page\" style=\"border: 1px double black;font-size: 14px;height: 22px;\">"

+ "<span style=\"margin: 15px\">当前第"+getPageNo() +"/"+getTotalPages() +"页  共"+getTotalResults()+"行</span>   "

+ "<span style=\"float: right;margin-right: 20px;\">"

+ "<a style=\"margin-right:8px;\" href=\"page.jsp?index=1\">首页</a>"

+ "<a style=\"margin-right:8px;\" href=\"page.jsp?index="+(getPageNo()-1)+"\">上一页</a>"

+ "<a style=\"margin-right:8px;\" href=\"page.jsp?index="+(getPageNo()+1)+"\">下一页</a>"

+ "<a style=\"margin-right:8px;\" href=\"page.jsp?index="+getTotalPages() +"\">尾页</a>"

+ "</span>   </div>";

return html;

}

 

private JdbcTemplate template = new JdbcTemplate();

 

public int getDefaultPageSize() {

return defaultPageSize;

}

 

public Page() {

super();

this.pageSize = defaultPageSize;

}

 

public String getPageSQL() {

return pageSQL;

}

 

public void setPageSQL(String pageSQL) {

this.pageSQL = pageSQL;

 

try {

IPageDao dao = (IPageDao)Class.forName(this.clazz).newInstance();

this.results  =  dao.listTables(pageSQL, new Integer[] {

pageNo * pageSize, (pageNo - 1) * pageSize });

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

 

public void setSqlCount(String sqlCount) {

this.sqlCount = sqlCount;

this.totalResults = template.queryForCount(sqlCount, null);

this.totalPages = totalResults / pageSize == 0 ? 1 : (totalResults

% pageSize == 0 ? totalResults / pageSize : totalResults

/ pageSize + 1);

}

 

public int getPageNo() {

return pageNo == 0 ? 1 : pageNo;

}

 

public void setPageNo(int pageNo) {

this.pageNo = pageNo < 1 ? 1 : (pageNo > totalPages ? totalPages

: pageNo);

}

 

public int getPageSize() {

return pageSize;

}

 

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

}

 

public int getTotalPages() {

return totalPages;

}

 

public int getTotalResults() {

return totalResults;

}

 

public List<?> getResults() {

return results;

}

}

 

<body>

<jsp:useBean id="pg" class="javabean.Page" ></jsp:useBean>

<jsp:setProperty property="pageSize" name="pg"  value="3"/>

<jsp:setProperty property="sqlCount" name="pg" 

value="select count(*) from dept"/>

<jsp:setProperty property="pageNo" name="pg" param="index"/>

<jsp:setProperty property="clazz" name="pg"

 value="dao.impl.DeptDaoImpl"/>

<jsp:setProperty property="pageSQL" name="pg" 

value="select * from (select t.*,rownum rn from  dept t where rownum<=?) where rn>? "/>

 

<%

List<Dept> emps = (List<Dept>)pg.getResults();

%>

<%=emps.size() %>

<div id="main">

<table>

<tr>

 

</tr>

</table>

</div>

<jsp:getProperty property="html" name="pg"/>

</body>

 

注意JAVABEAN设置的先后顺序

六、JSP其它动作

转发:<jsp:forward page="t.jsp"></jsp:forward>

<jsp:forward page="t.jsp?id=1"></jsp:forward>

<jsp:forward page="t.jsp">

<jsp:param value="AB" name="id"/>

</jsp:forward>

 

内容合并:<jsp:include page="t.jsp"></jsp:include>

<%@ include file=”” %>

 

区别:

指令方式

动作方式

相当于将两个页面合并为一个Servlet

只是内容合并,页面代码并未合并为一个Servlet

两个页面共享一个request对象

两个页面使用两个request对象

包含页面和被包含页面字符编码必须一致

 contentType="text/html; charset=utf-8"

不要求

指令方式效率更高

 

不能传递参数值

可以,借助jspparam动作

<jsp:include page="t.jsp">

<jsp:param value="1" name="id"/>

</jsp:include>

 

七、EL表达式

v EL表达式介绍

EL:Expression Language,表达式语言。

EL表现形式:  ${ }

EL表现结构:${user.name }   == <%= user.getName() %>

 

v EL作用范围

可以在自定义标签和JSTL中使用,另外可以在JSP或者JAVASCRIPT中使用。

 

v EL表达式运算符

① 算数运算符

1+1:  <%=1+1 %> <br/>

    1+1:  ${1+1 } <br/>

    1/0:  ${1/0 } <br/>

    0/0:  ${0/0 } <br/>

    ab :  <%="a"+"b" %><br/>

    ab :  ${a+b }  <br/>

    ab :  ${"a" }${"b" }

 

② 关系运算

相等:1==1 :      ${1==1 } | ${1 eq 1 }

不等于:1 != 2:   1!=2 : ${1!=2 } | ${1 ne 1 }

2>1    ${2>1 }  | ${2 ge 1 } 

 ge大于等于  gt大于

 Le小于等于  lt小于

 

③ 逻辑运算符

${1 eq 1 and 2 lt 1 }

只有短路与,没有逻辑与。

Or:或者

Not:否

 

④ Empty运算符

判断是否为空,空对象或者空字符串

${empty e }打印值为true

String str="123";

pageContext.setAttribute("a",str);

${empty a }

 

⑤ EL隐式对象

param、paramValues、pageScope、requestScope、sessionScope、applicationScope。

Param:获取参数值  ${param.id }

<jsp:setProperty property="name" name="g1" value="${param.name }"/>

<jsp:setProperty property="count" name="g1"

 value="${param.count }"/>

-----------------

request.getParameter(“count”)

 

paramValues:

/project_120_0011_javabean/MyJsp.jsp?psw=1&psw=2

${paramValues.psw[0] }

 

pageScope:作用范围为当前页面

requestScope:作用范围为request

${requestScope.aaa.ename }

⑥ EL表达式在JAVASCRIPt中使用

alert(‘${u.empno}‘);

alert(‘<%=path %>‘);

 

v pageContext

${pageContext.request.requestURL }

${pageContext.request.scheme }

 

八、JSP标签JSTL

1.JSTL介绍

JSTL:JAVA Server Page Standard Tag Library。JSP标准标签库。

目的:实现JSP页面无JAVA脚本。

tld文件用于描述标签库的配置文件。

 

2.配置JSTL

① 导入JSTL的JAR包。

② 进行指令的配置

<%@ taglib prefix="" uri="" %>

其值来自于jstl JAR包中MEAT-INF下。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

3.使用

① 设置值

<c:set var="i" value="1" ></c:set>

==pageContext.setAttribute(“i”,1)

② 获取值

 ${i }

<c:out value="${i }"></c:out>

③ 移除值

<c:remove var="i"/>

④ 捕获异常

<c:catch var="excep">

     <%int i = 5/0; %>

    </c:catch>

    ${excep }<br/>

    ${excep.message }

⑤ 切割

<c:forTokens items="${str }" delims=";" var="st" >

     ${st }<br/>

    </c:forTokens>

 

⑥ 数字循环

<c:forEach begin="1" end="10" step="1" var="i">

     ${i }

</c:forEach>

 

⑦ 判断

<c:if test="${empty requestScope.u }">

     <c:out value="当前无记录!"></c:out>

</c:if>

 

⑧ IF...ELSE

<c:choose>

    <c:when test="${1+1!=2}">

    <c:out value="1+1!=2!"></c:out>

    </c:when>

    <c:otherwise>

    <c:out value="1+1==2!"></c:out>

    </c:otherwise>

 </c:choose>

 

⑨ 循环遍历

<c:forEach items="${requestScope.emps}" var="emp">

   <tr>

   <td>${emp.ename }</td>

   </tr>

</c:forEach>

 

⑩ 综合

List<Emp> emps = new ArrayList<Emp>();

Emp emp = new Emp();

emp.setEname("ABC");

Emp emp1 = new Emp();

emp1.setEname("BCD");

Emp emp2 = new Emp();

emp2.setEname("CDE");

 

emps.add(emp);

emps.add(emp1);

emps.add(emp2);

 

request.setAttribute("emps",emps);

request.getRequestDispatcher("/jstl/jstl2.jsp")

.forward(request, response);

 

<table>

   <tr>

   <td>姓名</td>

   </tr>

   <c:choose>

   <c:when test="${empty requestScope.emps}">

   <tr>

   <td>当前无记录</td>

   </tr>

   </c:when>

  

   <c:otherwise>

   <c:forEach items="${requestScope.emps}" var="emp">

   <tr>

   <td>${emp.ename }</td>

   </tr>

     </c:forEach>

   </c:otherwise>

   </c:choose>

   </table>

 

4.Sql标签

5.格式化标签

格式化时间:

<fmt:formatDate value="<%=new Date() %>" type="date"/><br>

<fmt:formatDate value="<%=new Date() %>" type="time"/><br>

<fmt:formatDate value="<%=new Date() %>" type="both"/><br>

<fmt:formatDate value="<%=new Date() %>" 

pattern="yyyy-MM-dd HH:mm:ss"/><br>

 

另外也可以借助timeStyle属性:

<fmt:formatDate timeStyle="full" type="both">输出全部信息

<fmt:formatDate timeStyle="short" type="time">显示上午还是下午几点几分

<fmt:formatDate timeStyle="medium" type="time">显示几点几分几秒

<fmt:formatDate timeStyle="long" type="time">显示上午还是下午几点几分几秒

<fmt:formatDate timeStyle="short" type="date">显示07-4-24

<fmt:formatDate timeStyle="medium" type="date">显示2007-4-24

<fmt:formatDate timeStyle="long" type="date">显示2007年4月24日

 

格式化数字:

<fmt:formatNumber value="12.23" pattern=".00000">

</fmt:formatNumber><br/>

 

6.函数标签

  • fn:contains判断在某一字符串中是否包含指定的子字符串

Example:${fn:contains("Hello","H")}

  • fn:containsIgnoreCase依上,只是不再区分大小写
  • fn:startsWith是否已某字符串开头
  • fn:endsWith
  • fn:indexOf判断子字符串在原字符串中出现的位置
  • fn:split用于将一个字符串分割
  • fn:join已某字符连接
  • fn:replace使用新字符串替换原有字符串中的某一段子字符串
  • fn:trim
  • fn:substring用于从原有字符串截取一个子字符串
  • fn:substringAfter获取截取指定字符串之后的所有字符
  • fn:substringBefore与上相反
  • fn:toUpperCase将所有字母转为大写
  • fn:length

 

${fn:length("abc")}   =====3

 

7.自定义标签

自定义标签是显示设计的,用于在JSP页面中添加功能。

目的:做类似于JSTL的标签。

 

步骤:

1.写标签的配置文件,tld文件

<taglib xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

    version="2.1">

    

  <description>JSTL 1.1 core library</description>

  <display-name>JSTL core</display-name>

  <tlib-version>1.1</tlib-version>

  <short-name>my</short-name>

  <uri>http://www.120.com</uri>

 

 

  <tag>

    <name>hello</name>

    <tag-class>tag.MyTag</tag-class>

    <body-content>JSP</body-content>

    <attribute>

        <name>msg</name>

        <required>true</required>

        <rtexprvalue>false</rtexprvalue>

    </attribute>

  </tag>

 

</taglib>

 

2.写标签的实现类,继承TagSupport

public class MyTag extends TagSupport {

 

}

 

3.页面引入

<%@ taglib prefix="my" uri="http://www.120.com" %>

<my:hello msg="120"></my:hello>

 

4.实现JAVA代码

 

setPageContext:设置page的上下文,通过PageContext可以获取request、out等对象。

setAttribute:设置tld文件中标签描述的属性。

doStartTag:标签开始处理事情

SKIP_BODY:标签内的文本忽略不输出

EVAL_BODY_INCLUDE:标签中的文本内容能输出

doEndTag:标签结束处理事情

EVAL_PAGE:继续执行页面剩下的HTML

SKIP_PAGE:跳过整个JSP页面后面的输出,后面的输出会被截断。

public class MyTag extends TagSupport {

 

private JspWriter out ;

 

private String msg ;

 

public String getMsg() {

return msg;

}

 

public void setMsg(String msg) {

this.msg = msg;

}

 

@Override

public void setPageContext(PageContext pageContext) {

this.out = pageContext.getOut();

}

 

@Override

public int doStartTag() throws JspException {

try {

out.print("<font color=\"red\" >你好,"+msg+"</font>");

} catch (IOException e) {

e.printStackTrace();

}

return SKIP_BODY;

}

 

@Override

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

 

5.告诉系统tld文件所在的位置,用于系统的加载。

 <jsp-config>

   <taglib>

   <taglib-uri>http://www.120.com</taglib-uri>

   <taglib-location>/WEB-INF/myTag.tld</taglib-location>

   </taglib>

  </jsp-config>

 

作业:实现多语言翻译。有一个翻译表,里面存放中英文翻译,要求提供翻译标签,提供属性值为中文,此时将打印英文的输出结果。

 

注意:

rtexprvalue  用于设置自定义标签是否能是否EL表达式

body-content:值为empty表示标签中不能包含文本内容

 值为jsp表示标签中可以包含文本内容

九、SVN

SVN目的是实现代码同步,保证代码都是最新的。有历史记录控制。

版本控制:SVN、CVS。

Eclipse绑定插件:  Help  --->   Add/Remove Software

如何确认是否绑定:Window  --->   ShowView --- 》SVN

 

针对高版本的MyEclipse。

C:\Program Files\Genuitec\MyEclipse 8.x Latest

\configuration\org.eclipse.equinox.simpleconfigurator

 

作业:

1.建立一个工程,上传到服务器

2.提供一个地址,下载到客户端

 

十、上传下载

十一、数据池

相当于将很多数据库的连接放置于数据库连接池中。这样避免每次都需要创建数据库连接。注意每次用完数据库连接,会将该数据库连接对象放置于池中。

Tomcat数据库连接池。

JNDI:JAVA命名和目录服务,就是通过地址的方式查找具体的对象。

Tomcat数据库连接池使用的是JNDI去获取Tomcat的DataSource。

注意该方式只允许在Servlet以及JSP环境下。

 

maxActive:20   maxIdle:10

最大连接数:

最小连接数:maxIdle:10

最大等待时间:

 

拿1个连接,直接从最小连接数中获取。用完之后归还数据池。

拿11个连接,直接从数据池拿10个连接,临时创建10个连接

拿21个连接,直接从数据池拿10个连接,临时创建10个连接,剩下一个等待连接归还数据池。

一段时间之后,超过最小连接数的数据库连接将销毁。

 

1.配置context.xml

2.配置本系统web.xml

3.将class12.jar包放置于lib文件夹下

4.代码实现。

优势:

1. 资源重用 

 

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。 

 

2. 更快的系统响应速度 

 

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。 

 

3. 新的资源分配手段 

 

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 

 

4. 统一的连接管理,避免数据库连接泄漏 

 

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

 

十二、反射

v 反射概念

Reflect,反射是指在程序运行时获取自身的信息【自省】。在JAVA中只需要提供类所在的路径,就可以通过反射获取类的所有信息。

 

v 获取类中的属性

public class User {

protected int a;

 

private String username ; 

 

private String password ;

 

public String getUsername() {

return username;

}

 

public void setUsername(String username) {

this.username = username;

}

 

public String getPassword() {

return password;

}

 

public void setPassword(String password) {

this.password = password;

}

}

 

        User u = new User();

Field[] fields = u.getClass().getFields();//获取public修饰符

for (Field field : fields) {

System.out.println(field.getName());//获取属性的名称

}

 

Field[] fields1 = u.getClass().getDeclaredFields();

//获取类中的所有属性

for (Field field : fields1) {

System.out.println(field.getName());

}

 

作业:

1.获取属性的修饰符

Field.getModifiers()

Modifier.toString(field.getModifiers())

 

2.获取属性的返回值类型

field.getType().getName()

 

v 构造函数

① 无参构造函数

User uu = (User)Class.forName(path).newInstance();

uu.setUsername("123");

System.out.println(uu.getUsername());

 

② 有参的构造函数

Constructor<User>[] construs = 

(Constructor<User>[]) Class.forName(path).getConstructors();

//获取类的构造函数

System.out.println(construs.length);//获取类中有几个构造函数

for (Constructor<User> constructor : construs) {

int length = constructor.getParameterTypes().length;

//获取构造函数中有几个参数

if(length == 2){

             User user = constructor.newInstance("120","123456");

//调用构造函数,并给构造函数填充值

System.out.println(user.getUsername());

}

}

 

③ 获取父类或父接口

Class.forName(path).getSuperclass():父类继承

Class.forName(path).getInterfaces():父类实现

 

④ 调用方法

1.动态地给方法注入值

Method method = 

Class.forName(path).getMethod("setUsername", java.lang.String.class);

User u =(User)Class.forName(path).newInstance();

method.invoke(u, "1111");//u.setUsername("1111")

System.out.println(u.getUsername());

 

2.返回值

Method method1 = 

Class.forName(path).getMethod("test", java.lang.String.class,java.lang.Integer.class);

String value = (String)method1.invoke(u, "hello",1);

System.out.println(value);

 

作业:

利用上述知识,做Hibernate的模拟

最终效果:

insert into country (id,contry) values(‘1‘,‘中国‘)

 

Hibernate配置文件如下:

Insert into country (id,name) values(getId(),getCountry())

<hibernate-mapping >

<class name="com.csu.edu.pojo.Country" 

table="country" dynamic-update="true" >

<id name="id" column="id">

<generator class="sequence">

<param name="sequence">sales</param>

</generator>

</id>

<property name="contry" column="name"></property>

<property name="asd" column="name"></property>

</class>

</hibernate-mapping>

 

Insert into country (id,name) values(getId(),getCountry())

 

要求:不要求配置配置文件,只需要将该配置文件用java语言模拟,将其可设置为:

tableName="saless";

map.put("id", "id");

map.put("name", "contry");

注意:hashMap中第一个字符为数据库对应的字段,第二个字符为pojo中对应的字段。

public class Session {

 

private Map<String, String> map;

 

private String table;

 

public Session() {

this.table = "country";

map = new HashMap<String, String>();

map.put("id", "id");

map.put("name", "contry");// 第一个字段为列名 第二个字段为类中属性

map.put("sd", "loc");

}

 

public void add(Object o) {

// insert into country (id,name) values(getId(),getCountry())

String sql = "insert into " + this.table + "(";

Set<String> keys = map.keySet();

String columnStr = "";

String valueStr = "";

String param = "";

for (String key : keys) {

columnStr += key+",";

param = map.get(key);

String methodName = "get"+ param.substring(0, 1).toUpperCase()+param.substring(1);

try {

Method method = o.getClass().getMethod(methodName);

String value = (String)method.invoke(o);

valueStr += value+",";

} catch (SecurityException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

 

}

sql += columnStr.substring(0,columnStr.length()-1) +") values("+valueStr.substring(0,valueStr.length()-1)+")";

System.out.println(sql);

 

}

}

 

十三、自定义框架

1.为什么使用框架

 

 

2.Struts1框架搭建

 

① 建立WEB工程

② 修改web.xml

③ 拷贝struts-config.xml

④ 写Action实现

public class InputAction extends Action{

 

@Override

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

String username = request.getParameter("username");

 

if(username.equals("120")){

return mapping.findForward("success");

}else{

return mapping.findForward("error");

}

}

}

 

⑤ 

 

 

A.do     

 

3.自定义框架

目的:模拟Struts1框架,属于自己的框架,功能可以自己扩展。

1.建立XML文档,放置于CLASSPATH下

2.建立Schema文件,用于对XML文件进行验证

3.将XML文档转换为JAVA对象

4.将XML文档进行解析,并将数据填充到JAVA对象中

5.服务器启动时加载配置文件并转换为JAVA对象,在Web.xml文件中配置

 

 

 

 

作业:

1.登录界面,利用自定义框架。界面、FormBean、Action

2.在现有框架基础上添加方法控制功能,因为目前的处理方式基本是一个请求,对应一个Action。那么能不能扩展功能实现一个Action可以处理多个请求,一个请求代表一个方法,避免Action类过多。

3.团队合作。在团队开发过程中,由于需要用到SVN版本控制工具,那么对配置文件的修改频率过高,因此很可能存在覆盖现象。有什么方式解决。

以上是关于JSP运行于服务器端而JavaScript运行于客户端吗?的主要内容,如果未能解决你的问题,请参考以下文章

简述JSP运行原理

初学node.js

JavaWeb--深入Servlet与JSP(运行原理)

JSP

javaee三大组件是啥

JSP学习-01