jsp/servlet

Eclipse JSP/Servlet 深入解析 JSP 是一种动态网页技术,它将 HTML 与 Java 代码相结合,使开发者能够轻松地创建动态网页。JSP 页面由 HTML 标签和 JSP 标签组成,其中 JSP 标签负责执行 Java 代码。Eclipse JSP/Servlet 是 Java Web 开发中的重要技术,掌握它们对于 Java Web 开发者来说至关重要。本文对 Eclipse JSP/Servlet 进行了深入解析,希望对读者有所帮助。字数统计:约 2000 字SEO 优化。 阅读详情

1:为什么要出现JSP跟servlet?

前言:JSP跟servlet技术是用来开发动态网页的web技术;JSP在本质上就是一个servlet,servlet在本质上就是一个java类;

(1)   除了Linux,unix操作系统之外,当前windows操作使用数量是最多的,C语言跟C++的存在,使得java在C/S模式开发下,受到了打压,所以java要想活下去,就得转向B/S模式的开发,就是web应用的开发

(2)   刚开始java语言在web应用的开发领域只有servlet,servlet就是一个java类,要想做网页,在类中就必须写大量的html标签,使得代码很乱,也不容易维护

(3)   为了解决html标签跟java代码的分离,就出现JSP技术,由JSP(java server page)单独负责写html标签,servlet只负责写java代码,这样java代码跟html标签就可以想分离出来,不论是在项目开发还是维护上,都容易;

(4)   但是JSP是动态web开发技术,单独写html代码就成了html文件了,那是静态网页了;JSP中也允许写少量的java代码,这些java代码在JSP中称之为脚本元素,但是依据MVC的设计理念来看【MVC—model—view—controller:简单的来说就是servlet只写java代码,jsp只写html标签,供用户看的,java代码跟html不能凑合到一起】,脚本元素的存在也是不合理的;所以在JSP中就包含JSP标签【也称之为JSP动作àJSPAction】另外也有el(表达式语言)跟JSTL(JSP standardTag Library JSP标准标签库)这两项技术在JSP中代替java代码

 

2:javaweb常用名词解释

(1)web服务器:专门处理web服务请求,也就是HTTP协议的80端口或者是8080端口的数据处理以及交互。常用的Tomcat,jBoss,WebLogic,IIS(Internet Information Server)

应用服务器:通过特定的网络通道来传输数据进行特定的数据交互;FTP,网游服务器

广义上说web服务器也属于应用服务器的一种;

(2)JSP引擎,servlet引擎

Servlet引擎:servlet是由服务器调用的,而调用servlet的程序称为servlet程序

JSP引擎:服务器将JSP翻译成servlet的程序叫做JSP引擎;

 

3:Tomcat服务器的目录结构

 

Bin:启动跟关闭Tomcat的批处理文件存在里面

Conf:Tomcat的配置文件,里面的几个文件

(1)   servlet.xml:配置server的相关信息,Tomcat的启动端口;配置Host跟Context

Tomcat默认端口8080

问:一个Tomcat配置多个应用怎么做?

在该文件中配置service节点,名称要唯一,端口不能重复;

   

(2)   web.xml配置web应用的,但是这个文件跟我们自己开发的应用中的web.xml文件不是一个文件;这个文件中有一个servlet节点元素

我们自己的web.xml文件都会默认的继承该web.xml文件,如果用户的请求在我们web.xml中找不到资源,会去找这个DeaultServlet,找到了资源,返回给用户,找不到,则404错误;

(3)tomacat-users.xml:配置Tomcat的用户名跟密码

Lib:存放运行Tomcat的jar包,这里面有两个很重要的jar包

是servlet跟jsp的,在Eclipse下开发servlet,不需要导入这两个包,是因为Tomcat自带的;若是你的Tomcat没有启动,在导入别人的项目时候,会报错,因为支持servlet的jar包就是放在这个目录下的

Logs:存放日志文件的

Temp:临时目录

Webapps:我们自己开发的项目就得放在这个目录下,而且是有一定的存放规则的

       打开我们的项目中,在WebContent目录下的文件都存在第一级目录,写的servlet则存在WEB-INF目录下,classes目录放的是java类,lib目录是jar包,web.xml文件也在这里面

Work:Tomcat的工作目录,存放的是被访问后的jSP翻译成servlet的文件跟.class文件

要记住这个index-jsp文件

 

Jsp跟servlet开发遵循了MVC【model---view—controller】的开发模式:

Model:javabean、entity类,在Hibernate中叫做PO类【persistent objects】

规则:

(1)   implements Serializable

(2)   无参构造函数

(3)   Setter getter方法

(4)   主键是Integer or Long类型

View:JSP页面

Controller:servlet

在SSH中会划分成表现层,业务逻辑层,数据访问层,持久层

 

                                          JSP  【java server pages】

 

jsp页面的执行过程:

       1.jsp页面在第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,然后调用servlet的service方法;;(jsp翻译后的Servlet会被放到tomcat的work目录下)

       2.当jsp页面被再次访问的时候,web容器会去直接调用Servlet的service()方法,所以通常来讲jsp只是在第一次被访问的时候比较慢

       3.如果jsp页面做了修改,此时web容器会重新翻译jsp

 

4:JSP文件包含什么?

(1)   注释

(2)   模板元素

(3)   脚本元素

(4)   指令元素

(5)   动作元素(也称JSP标签)

 

 

注释:<!-- --> <%--  --%>

第一种注释跟html的注释一样,第二种注释后,客户端查看不到被注释的代码,第一种可以查看到,第二种注释也是用于注释<%%>小脚本的;

 

模板元素:就是html标签或者XML元素

 

脚本元素:分为三种

脚本声明<%!   %> 要写在<html>之前

脚本表达式<%=   %>写表达式的地方

小脚本<%   %>写java代码

 

这三种脚本都对应在JSP翻译后的servlet文件中;上面的work目录:index_jsp.java

脚本声明是处于类中的成员属性的位置,后两者都存在_jspService()方法中;

例子

<%= new java.util.Date()%>  %前面不能有分号

<%

       Java.util.Datedate=new java.util.Date();

       out.print();

%>

 

其中JSP中html标签【模板元素】,是通过翻译后servlet的_jspService()方法中的out.print();打印给客户端的;

 

 

指令元素:

常用的是pageinclude taglib指令

<%@ page pageEncoding="UTF-8"%>

<%@ include file="/include/common.jsp"%>【静态include】

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

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

其中page指令中还包括另外两个属性

<%@ page pageEncoding="UTF-8"isErrorPage="false" isELIgnored="false"%>

其中pageEncoding属性是解决JSP页面的中文乱码问题,默认是ISO8859-1,改为UTF-8;

page指令也可以用于导入java的类库

<%@page import=”java.util.Date”>

上面两句合并

<%@ page pageEncoding="UTF-8"isErrorPage="false" isELIgnored="false"%  import=”java.util.Date”>

 

****在写java代码中,一个类会默认的importjava.lang.*;

在JSP中,JSP引擎会自动导入以下的包

java.lang.*

javax.servlet.*

javax.servlet.jsp.*

javax.servlet.http.*

 

 

动作元素:【jsp标签】

<jsp:includepage=included.jsp flush=true />【动态include】

<jsp:forword>

<jsp:param  >

//jsp与javaBean相关的三个标签

<jsp:userBean>

<jsp:setProperty>

<jsp:getProperty>

 

问:jsp中的动态include跟静态include的区别

(1)动态include用jsp:include动作实现<jsp:include page=include.jspflush=true>,总会检查所包含文件的变化,适用于包含动态的页面,并且可以带参数

静态include,用指令元素实现,不会检查所包含文件的变化,适用于包含静态页面

(2)<jsp:include>动态include设计到的两个jsp文件会被翻译成两个servlet

       <%@include file=””%>静态include会把两个jsp文件翻译成一个servlet,但是两者最后都是将内容合并为一个jsp文件,返回给客户

 

 

 

5:JSP中的九大隐式对象

JavaEE API

       request- javax.servlet.http.HttpServletRequest(Interface)

       response - javax.servlet.http.HttpServletReponse(Interface)

       session -javax.servlet.http.HttpSession(Interface)

       application- javax.servlet.ServletContext(Interface)

       config- javax.servlet.ServletConfig(Interface)

       pageContext- javax.servlet.jsp.PageContext(Class)

       out- javax.servlet.jsp.JspWriter(Class)

 

JavaSE API

       page- java.lang.Object(class)

       exception- java.lang.Throwable(class)

 

 

6:request对象的常有方法:

 

(1)setAttribute(Stringname,Object):设置名字为name 的request 的参数值

getAttribute(Stringname):返回由name 指定的属性值

removeAttribute(Stringname):删除请求中的一个属性

(2)getSession([Booleancreate]):返回和请求相关Session

(3)getParameter(Stringname):获得客户端传送给服务器端的有name 指定的参数值

(4) getParametervalues(Stringname):获得有name 指定的参数的所有值

 

getCookies():返回客户端的所有Cookie 对象,结果是一个Cookie 数组

getCharacterEncoding():返回请求中的字符编码方式

getContentLength():返回请求的Body 的长度

getHeader(String name):获得HTTP 协议定义的文件头信息

getHeaders(String name):返回指定名字的request Header 的所有值,结果是一个枚举

的实例

getHeaderNames():返回所以request Header 的名字,结果是一个枚举的实例

getInputStream():返回请求的输入流,用于获得请求中的数据

getMethod():获得客户端向服务器端传送数据的方法

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚

举的实例

getProtocol():获取客户端向服务器端传送数据所依据的协议名称

getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址

getRemoteAddr():获取客户端的IP 地址

getRemoteHost():获取客户端的名字

getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径

getServerPort():获取服务器的端口号

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例

 

重点讲解红色标记的几个方法

 

(1)setAttribute()跟getAttribute()

request.setAttribute()常用于:当用户登录失败,可以给用户发送一个用户名或者密码错误的提示;例子:

 

UserAction class

request.setAttribute(“message”,”用户名或者密码错误”);

 

user.jsp中

request.getAttribute(“message”);

 

但是上面Action类中还缺一条语句,所以现在在jsp页面是获取不到错误信息的;request的setAttribute()涉及到一个很重要的问题:转发跟重定向的问题

页面的跳转就只有转发跟重定向两种方式:request,set后的属性必须通过转发的方式才能传递到JSP中;不能用sendRedirect(“user.jsp”)的方式,否则jsp中获取不到值,

修改上面的代码:

UserAction class

request.setAttribute(“message”,”用户名或者密码错误”);

    request.getRequestDispatcher(“user.jsp”).forword(request,response);

user.jsp中

request.getAttribute(“message”);

 

复习一下转发forword跟重定向redirect的区别:

【重定向:你找我借钱,我没有,你自己去找张三借】

【转  发:你找我借钱,我没有,我帮你去找张三借】

(1)Forword转发是控制权的转向,在浏览器地址栏中不会显示转向后的url;

   Redirect会重新发送请求,浏览器地址栏会出现新的url;

(2)前者更加高效,在不使用request.setAttrbute()的前提下,使用forword可以隐藏实际的请求地址;

  后者可以跳转到其他的服务器资源上;在SSH中,一个Actionextends BaseAction后,可以使用getRequest.put()的方式来代替该方法;

(3) 请求重定向客户端向服务器发送两次请求请求转发发送一次请求

 

request.removeAttribute()可以删除前面request.setAttribute()设置后的属性

 

(2)getSession()方法讲解

一般用在后台上;

request.getSession().setAttribute(“username”,username);

这个方式跟request.setAttribute()的区别就是

(a)session以及request的作用域范围不同;本方法主要用于,用户登录成功后,在本站点下的所有页面中都可以用session.getAttribute()的方法获取该用户的用户名

(b)方法的参数不一样,前者参数全是String类型,后者的参数,第一个参数是String,第二个参数是obj

(c)它既可以使用转发,也可以重定向;

 

 

 

(3)request.getParameter()

该方法主要在后台获取表单或者超链接提交过来的数据

例子:

request.getParameter(“username”);

request.getParameter(“password”);

 

(4)requet.getParameterValues()

用来获取表单中复选框提交过来的数据,在checkbox一定要写value的属性值,才可以获取值,否则没有返回值;

 

 

问:request.getAttribute() 和 request.getParameter() 有何区别?

(1)getAttribute()必须先setAttribute()才能使用,若是request.setAttribute();必须用forword的方式若是rquest.geSession().setAttribute()的方式,两种跳转方式都可以;

(2)getParameter()方法主要用来获取表单或者超链接提交过来的数据;

 

 

7:session对象的常有方法:

setAttribute()

getAttribute()

invalidate()

getId()

 

前两个方法在request对象的时候,已经说过;setAttribute(),需要request.getSession().setAttribute(String,Object)才能使用;

Session.getAttribute(String),用在JSP中

 

invalidate();-àrequest.getSession().invalidate();注销用户

getId();获取该session在创建的时候,JSP引擎为它设置的ID;

 

 

 

 

8:JSP的属性范围(四种会话跟踪技术,4个域对象)

(1)page的作用域只在当前页面中,调转到另一个页面,就会失效;

(2)request:从一次请求开始,在结果的返回,这是一次request的作用范围(可能涉及到多个page)

(3)session:从打开一个网站的首页(不包含登陆)开始,一直到注销(退出)登陆为止,都是session作用范围(多个用户跟一个用户的多次登陆都是session)

(4)application:(在服务器没有关闭的前提下,任何时刻,多个用户,一个用户的多次登陆,对网站的访问都在application的范围内);生命周期:web应用被加载的时候开始,web应用被移除或者服务器关闭的时候,生命周期结束

 

page----àpageContext

request--àrequest

session--àsession

application--àservletContext

 

 

 

9:Response

有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

response.setDateHeader("Expires",-1);

response.setHeader("Cache-Control","no-cache"); 

response.setHeader("Pragma","no-cache"); 

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是三个响应头同时使用。

Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面

Cache-Control响应头有两个常用值:

no-cache指浏览器不要缓存当前页面。

max-age:xxx指浏览器缓存页面xxx秒。

 

 

                                             Servlet

11:servlet 的运行流程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。

②装载并创建该Servlet的一个实例对象。

③调用Servlet实例对象的init()方法。

④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。

⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

 

 

12:servlet的生命周期

Servlet一共有五个方法:init(),serveice(),destroy(),getServletConfig(),getServletInfo();其中前三个方法是与servlet生命周期相关的方法;

Servlet先被服务器实例化后,web容器运行其init()方法,初始化servlet,接着调用service()方法,根据用户的请求方式,分别调用doGet(),doPost()方法,当servlet结束服务的时候,容器调用destory()方法,将servlet销毁;

 

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至服务器关闭或者web应用被移除的时候,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

 

 

13:servlet开发方式:

(1)   extends HttpServlet

(2)   extends GenericServlet

(3)   implements Servlet

通常是extendsHttpServlet,因为抽象类HttpServlet对Servle接口进行了功能扩展,提供了一些与HTTP协议相关的方法;

 

14:servlet配置

<web-app>

       <servlet>

              <servlet-name>userAction</servlet-name>

              <servlet-class>UserAction</servlet-class>

       </servlet>

       <servlet-mapping>

              <servlet-name>userAction</servlet-name>

              <url-pattern>/*</url-pattern>

       </servlet-mapping>

</web-app>

 

15:servelt结构

主要是doGet()跟doPost()方法,get请求一般都调用doPost()方法去处理

publicclass TestServlet extends HttpServlet{

   

    @Override

    protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       doGet(req, resp);

    }

    @Override

    protectedvoid doPost(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       //这一句是通过表单的隐藏域传递过来的值

       String action=req.getParameter("action");

       if (action.equals("register")) {

           register(req,resp);

       }  

    }

    privatevoid register(HttpServletRequestreq, HttpServletResponse resp) {

      

       //写要操作的代码。。。。【包括JDBC】

    }

}

 

 

 

EL跟JSTL

El:${rqeustScope.message}  ${sessionScope.message}

el表达式不能写if,for等逻辑语句,所以需要对web域中的list和map集合进行迭代就需要结合 jstl 迭代标签

 

Jstl:常用的<c:foreach >跟<c:if>

 

Filter

在项目中用Filter做中文乱码的处理,也需要对mysql的配置文件进行修改

写一个类实现Filter接口,实现里面的init(),destroy(),doFilter(ServletRequest  arg0,ServletResponse arg1,FilterChain arg2);

 

 

EncodingFilter类跟servlet一样,写完之后,要在web.xml中进行配置,Listeren监听器也需要在web.xml中配置

 

 

 

 

JDBC[java data base connectivity]

1:JSBC的面向接口编程

Sun公司为了统一大家对数据库的操作,定义了一套API,这套API就称为JDBC;这些api都是接口,主要有具体的数据库厂商去实现,而实现这些接口的实现类就称之为数据库的驱动,存放在mysql的jar包中;

 

2:JDBC的操作步骤(四步)

加载数据库驱动---à取得跟数据库的连接--àCRUD操作-à关闭资源

 

3:JDBC要操作的类跟接口全部存放在java.sql包下

 

 

3:JDBC连接mysql或者Oracle,有几点区别就是,要加载的数据库驱动,以及url,user,password,而在Hibernate中,将会增加一个dialect(方言)的区别

下面列举出jdbc连接mysql跟oracle的驱动加载跟连接的代码

Mysql:

Class.forName(“com.mysql.jdbc.Driver”);或者直接new Driver();

url=”jdbc:mysql://localhost:3306/mysqlname”;或者url=”jdbc:mysql:///mysqlname”;

如果是本机ip,就用后一种方式

User=“root”,password=“root”

 

Oracle:

Class.foraName(“oracle.jdbc.driver.OracleDriver”);

url=”jdbc:oracle:thin:@localhost:1521:数据库名称”;

user=”scott”;  password=”tiger”;

 

 

一般将【加载数据库驱动,取得跟数据库连接,关闭资源】都放在一个util工具类中(工具类都是static的method,用类名调用)

 

publicclass DB {

   

    privatestaticfinal String URL = "jdbc:mysql:///jdbctest";

    privatestaticfinal String USER = "root";

    privatestaticfinal String PASSWORD = "sys";

 

    publicstatic Connection getConnection() {

       try {

           new Driver();

           return DriverManager.getConnection(URL, USER, PASSWORD);

       } catch (SQLException e) {

           e.printStackTrace();

       }

       returnnull;

    }

    publicstaticvoid close(ResultSet resultSet, PreparedStatementpreparedStatement, Connection connection) {

       if (resultSet != null) {

           try {

              resultSet.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

       if (preparedStatement != null) {

           try {

              preparedStatement.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

       if (connection != null) {

           try {

              connection.close();

           } catch (SQLException e) {

              e.printStackTrace();

           }

       }

    }

 

}

 

 

4:jdbc中Date()的类型是java.sql.Date类型的,而不是java.util.Date

在entity类中定义Date类型的成员属性,就用java.util.Date,而在jdbc的prepareStatement.setDate(int,Date)的时候,传递的就应该是java.sql.Date类型的Date数据;

 

 

JDK中的定义

 

 

Java.sql.Date 是继承自java.util.Date的,在preparedStatement.setDate()的时候,要对util中的Date做个类型转换,转成sql中的Date;

在entity class中的Date是util中的Date类型,在servlet中使用request.getParameter(“date”);得到的是字符串类型的;

 

对未定参数date进行set

此时的date3就是sql包下的Date类型;

 

 

5:在jdbc的API中,除了DriverManage是类之外,常用操作的API都是接口,如

Driver,Connection,ResultSet,PreparedStatement,Statement,CallableStatement

 

DriverManage.getConnection(url,user,password);-à获取跟数据库的连接,处于JDBC操作的第二步

 

Connection中常见的方法,createStatement(),preparedStatement(String),commit,setAutoCommit(false),rollback();

因Statement存在SQL注入攻击的问题,所以用preparedment代替Statement;CallableStatement是有关存储过程的操作

后面三个是jdbc针对事务处理相关的方法;

 

Resuset:主要的方法next(),以及很多getXXX()方法

next()主要遍历结果集中的元素,使用getXXX()方法取出,一般使用getXXX(String);

 

 

6:JDBC对事务的处理

 

(1)    事务的概念:针对数据库进行的一组操作,包含多条SQL语句,比如从张三的账户扣除100元到李四的账户上,那么这件事情,要么全都做完,要么不做;谁都不能吃亏,谁也不能白拿钱;

(2)    事务的作用:将扣钱跟加钱的SQL放在同一事务中,一旦出现异常,没有损失;

(3)    事务实现原理:原先的SQL语句是自动提交的,执行事务的话,就需要手动的提交事务connection.setAutoCommit(false)。一旦在事务中间出现异常,也可以使用回滚connection.rollback()功能,避免损失,如果没有出现异常,那么在最后使用connection.commit()手动提交时事务

(4)    事务的四大特性:原子性,一致性,隔离性,持久性

原子性

原子性是事务最小的单元,不可再分割,这些操作必须全部完成,或者全部失败;张三转账给李四,李四接受张三的转账,都是不可再分的,有一个失败,则全部失败

一致性

指对数据库进行操作的前后,数据库中数据是一致的,即便转账失败,张三跟李四都没有受到损失;转账成功后,张三跟李四的金额数量,跟转账前的总金额也是一致的

隔离性

多个并发事务可以同时进行但是在操作的时候彼此之间不能进行访问,只有操作之后才可以访问数据;现在有张三李四两个账户:各2000元;现在也有两个事务T1跟T2,T1将对张三跟李四两个账户进行转账,而T2事务做的事情是:如果发现张三跟李四的账户总金额不足4000元的话,将对每个人的账户扣除500元;而T1的事务现在只做了一半,此时T2就来对账户进行检测,这样是不合理的;

持久性:

系统崩溃了,事务也能提交;提交后的数据,不可回滚,永久有效;

 

            //取消自动提交

           connection.setAutoCommit(false);

          

           preparedStatement.setString(1, title);

           preparedStatement.setString(2, author);

          

           try{

              preparedStatement.executeUpdate();

              //所有操作成功,提交事务

              connection.commit();

           }catch(Exception exception){

              //否则回滚

              connection.rollback();

           }

 

在Hibernate中,事务是默认关闭事务的自动提交的,需要手动提交

transaction.commit();

 

 

7:元数据

DatabaseMetaData跟ResultMetaData

区别

(1)    D~~~是通过connection.getMetaData()获取的

(2)    R~~~是通过preparedStatement.getMetaData()获取的

 

(3)    D~~~~是获取数据库的相关信息

(4)    R~~~~是获取结果集的相关信息

 

 

 

8:数据库连接池:DBCP

就是数据库连接对象的一个缓存池,传统的方式,dao层完成数据库查询更新操作后,就会断开与数据库的连接,但是数据库的连接是非常耗费时间的,现在先创建一个跟数据库连接的缓存池,这样用户发送请求过来后,dao不需要再次连接数据库,直接从连接池获取就行李,用完之后也不需要关闭;

 

超市货物采购系统的 Jsp/Servlet 实战项目 本文还有配套的精品资源,点击获取 简介:本项目是一个基于 Jsp/Servlet 技术开发的超市货物采购系统压缩包文件,涉及 Java Web 开发的实践应用。系统包含完整的源代码和数据库,为学习 Jsp/Servlet 技术、数据库集成以及 MVC 设计模式提供了有价值的参考。学生和初学者通过该系统可以深入理解 Web 应用程序的构建过程,包括需求分析、设计、编码及测试等... 阅读详情

相关推荐

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1061

jsp技术

1.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口 的init(),service()和destroy方法表达。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 web容器加...

weixin_48070447的博客 908

【tensorrt】——深入解析TypeError: pybind11::init()报错:CUDA版本冲突与解决方案

本文深入解析了TensorRT中常见的TypeError: pybind11::init()报错问题,重点探讨了CUDA版本冲突的根源与解决方案。通过实际案例展示了PyTorch与TensorRT的版本兼容性问题诊断方法,并提供了conda环境管理、环境变量配置等实用修复技巧,帮助开发者有效解决CUDA初始化失败问题。

ggg99的专栏 272

JSP与Servlet

Servlet 可以看作是在服务器上运行的小程序,一个页面处理程序。

qq_31856061的博客 3336

ETAP实战:如何用仿真软件快速绘制标准一次接线图(附模板下载)

本文提供了一套基于ETAP软件高效绘制标准一次接线图的完整实战工作流。从国标符号库配置、绘图模板创建,到核心设备绘制、参数标注,再到利用软件模型进行拓扑检查与短路电流校核,手把手教你实现从零到一的专业图纸设计。文末附有实用模板下载,助你大幅提升电力设计效率与图纸质量。

weixin_29291573的博客 514

使用Simulink对氢燃料电池与锂电池的混合储能系统进行建模

本文介绍了基于Simulink的氢燃料电池与锂电池混合储能系统建模与协同控制方法。系统通过氢燃料电池提供稳定能源,锂电池实现快速响应,结合DC-DC变换器和负载管理器实现动态调控。详细阐述了从模型创建、关键模块配置到控制器设计的完整流程,重点说明了功率分配算法和充放电控制策略的实现。通过仿真分析验证了系统在不同负载条件下的性能表现,包括响应速度、工作效率和稳定性等指标。该方案为新能源混合储能系统的设计与优化提供了实用指导,有助于提升系统可靠性和延长电池寿命。

amy_mhd的博客 315

Javaweb——第二章 Jsp和Servlet

JSP(全称Java Server Pages),中文名叫JAVA服务器页面,其根本是一个简化的Servlet设计,是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术有点类似A5P技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件。JSP技术是以。

qq_58029155的博客 3907

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

JSP和Servlet的区别(servlet生命周期)

在说JSP和servlet的区别先说说servlet(因为JSP在本质上就是Servlet,只是两者的创建方式不一样)   Servlet工作原理: 1.     在客户端对web服务器发出请求 2.     web服务器接收到请求后将其发送给Servlet 3.     Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处...

念念不忘,必有回响 5080

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1347

西门子博图v16安装密钥提示报错:CryptAcquireContext MS_DEF_PROV Error of containger opening...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 3306

Servlet与jsp详解

Servlet与jsp详解 一、Servert 概念:运行在服务器端的小程序 1.servlet就是一个接口,定义了java类被浏览器访问到的规则 2.将来我们自定义一个类,实现该接口,复写方法 快速入门 1.创建javaEE项目 2.定义一个类实现servlet接口 public class ServletDemo01 implements Servlet 3.实现接口中的抽象方法 4.配置servlet —在web.xml中配置servlet <servlet> &

m0_54349490的博客 2256

STM32cubeMX配置FreeRTOS软件定时器

文章目录前言1.软件定时器概述一.软件定时器特性二、使用cubeMX生成软件定时器总结 前言 本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。 1.软件定时器概述 一.软件定时器特性 软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期 (period)。 指定类型定时器有两种类型: 1.一次性 这类定时器启动后,它的回调函

m0_49476241的博客 6950

JSP/Servlet页面重定向

Post/Redirect/GET的模式被广泛应用在Web程序开发中。和传统的表单提交方法不同,这种模式在POST请求完成后,会重定向(HTTP状态码302)到另外一个页面。博客登陆就是典型的例子。

659

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Jsp/Servlet

B/S:浏览器和服务器 C/S:客户端和服务器 -sun公司主推B/S架构 -基于java语言的(所有的大公司,或者一些开源的组件,都是用java写的) -可以承载三高(高并发,高可用,高性能)问题带来的影响 -语法像ASP服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;Tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun

weixin_55658277的博客 166

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Eclipse JSP/Servlet 环境搭建

搭建 Eclipse JSP/Servlet 开发环境需要安装 Java 开发工具包(JDK)、Apache Tomcat 服务器,并配置 Eclipse IDE 以支持动态 Web 项目。以下是简化的步骤,帮助您快速搭建环境并运行简单的 JSP 和 Servlet 程序。通过安装 JDK、Apache Tomcat 和 Eclipse IDE for Java EE Developers,并正确配置动态 Web 项目,您可以快速搭建一个功能完整的 JSP/Servlet 开发环境。

likuoelie的博客 929

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

servlet/jsp

1.servlet基础 (1)什么是servlet? servlet就是sun公司用来扩展web服务器功能的组件规范,因为web服务器它通常只能够处理一些静态资源的请求,在生活中我们会需要到很多的需要加载动态资源的请求,而servlet刚好满足了它的这点要求,它是用来加载动态资源的。 (2)如何写一个servlet? 1.通常我们是先新建一个java类,新建的这个java类实现servlet这个接口或者继承HttpServlet这个抽象类,通常情况下我们都是用这个类来继承HttpServlet。 2.编译

行动之前 1064

JSP/Servlet的重定向技术综述

有关JSP/Servlet的重定向技术综述如下1.RequestDispatcher.forward()  是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所

龙行天下 1960

Servlet/JSP 架构

Servlet技术是Java开发Web应用的一种底层技术,主要用来生产动态的Web内容,大多数情况用来进行一些后台管理。而JSP是为了简化Servlet程序开发而发布的技术,语言基本由HTML和Java代码组成。Servlet/JSP出现后,涌现出了大量的框架来帮助程序猿快速开发。今天就写一写Servlet/JSP的应用架构。Servlet其实就是一个Java程序,一个Servlet应用包含多个S

BestbpF的博客 2475

JSP/Servlet环境配置

下载安装JDK并配置环境变量 这里我下载安装的是jdk-7u51-windows-i586,如果你没有请到Oracle官网下载; 【我的电脑】-【高级系统设置】-【环境变量】-系统变量中的Path添加Java bin目录; 命令窗口测试配置环境变量正确与否。下载服务器 我学习使用的是Web容器apache-tomcat-7.0.50-windows-x86,如果没有请到Apache下载。配

hankaibo 1万+

糟糕,又得重新认识上古技术--Servlet/JSP

上一篇讲解了,本篇分析如何通过Servlet、JSP快速渲染网页。有些小伙伴可能疑惑了:Servlet、JPS是多古老的技术了,我SpringBoot一梭哈,还在这卷啥呢?其实不然,SpringBoot也是基于Servlet封装的,通过编写简单的Servlet,认识基本原理,后续可以更好地理解SpringBoot,同时也了解Java Web发展历程。

791

JSP/Servlet中的Listener

重庆邮电大学 pppz(Java学生) 781

Jsp/Servlet中tomcat基础配置

1 Jsp/Servlet介绍 Jsp/Servlet技术介绍:jsp/serlvet是开发动态web的一门技术,特别擅长开发B/s架构的程序。Php、.net 动态网页与静态网页 动态网页 动态网页中的数据主要是从数据库中获取(mysql/oracle) 静态网页 网页中的数据固定写死在html代码中 2 B/S架构与C/S架构 B/S:Browser/Server,浏览器对服务器的程序 C/S:Client/Server,客户端对服务器 3 服务器

赵广陆 770

JSP/Servlet应该学习什么

概述        DRP的学习战线拉得很长,因为中途学习.net而停止了java的学习。停止java,学习.net,使.net的学习更加的扎实了,也使我再继续学习DRP时,学习目标变得更加的明确了。 DRP JSP的内置对象,JSTL Servlet Filter Listen JDBC 连接对象连接池 动态代理 总结

张青山 1204
上一篇: JavaSE
下一篇: Spring
Java_lab
博客等级 码龄14年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值