热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习jsp和servle整合

1.什么是jsp?jsp全名为:javaserverpage,中文名为:java服务器页面,其实就是一个简化的servlet,是由sun公司倡导,许多公司参与一起建立的动态网页设计

1.什么是jsp?

jsp全名为:java server page,中文名为:java服务器页面,其实就是一个简化的servlet,是由sun公司倡导,许多公司参与一起建立的动态网页设计标准

特点:

(1)本质上还是servlet

(2)跨平台,一次编写处处运行

(3)组件跨平台

(4)健壮性 和安全性

2.什么是servlet?


Servlet 是什么?

简洁点:狭义的就是java语言实现的接口,广义的就是一种实现了servlet接口的java类,

官方解释:

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:



  • 性能明显更好。

  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。

  • Servlet 是独立于平台的,因为它们是用 Java 编写的。

  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。

  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。


Servlet 架构

下图显示了 Servlet 在 Web 应用程序中的位置。


Servlet 架构

Servlet 任务

Servlet 执行以下主要任务:



  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。

  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 COOKIEs、媒体类型和浏览器能理解的压缩格式等等。

  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。

  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。

  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 COOKIEs 和缓存参数,以及其他类似的任务。

3.jsp和servlet的区别?

(1)jsp侧重在前端,显示页面(view),servlet侧重逻辑在java文件中(controller)

(2).servlet是纯java代码,jsp是java和html的组合

(3)jsp本质上就是servlet的扩展

4.jsp和servlet的整合

既然我们已经了解了他们各自的特点,此时我们也就明确了他们工作的主要地方,jsp用于页面显示,servlet是在java代码中:

完成用户登录

第一步:在WebRoot目录下创建名为login.jsp的前端页面

第二步:在login.jsp页面中编辑一个form表单,指定action和method,action是将数据提交給servlet,method是数据提交的方式为post

第三步:我们填写完数据后,点击登录按钮,开始向指定的servlet提交数据,

第四步:servlet调用服务(service)层代码,服务(service)层代码调用Dao(数据访问层)层代码,Dao(数据访问层)层带着数据去数据库查询,并将查询到的数据与我们提交的数据进行比较。

最终:Dao层将结果返回给servlet,servlet再将结果返回到前端,前端根据结果做出相应的页面跳转或者提示信息

用户退出:

 

第一步:在main.jsp中添加退出登录按钮,为超链接标签

 

第二步:我们点击退出登录按钮,超链接向OutServlet发送请求,servlet处理请求,销毁session对象,并重定向到登录页面。

用户注册:

第一步:编写注册页面名为register.jsp

第二步:填写数据,提交給处理注册请求的servlet

第三步:servlet调用服务层方法,服务层调用Dao层方法,完成数据的插入操作

第四步:Dao层返回数据给servlet,servlet将值返回给浏览器页面,并提示注册成功

最初代码:

Dao层实现类


package com.mt.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mt.dao.UserDao;
import com.mt.pojo.User;
import com.mt.util.DBUtil;

public class UserDaoImpl implements UserDao{
 @Override
 public User getUserInfo(String uname, String pwd) {
  //声明变量
  Connection cOnn=null;
  PreparedStatement ps=null;
  
  ResultSet rs= null;
  User u=null;
 
  try {
   //创建连接
   cOnn=DBUtil.getConnection();
   //创建SQL命令
   String sql="select * from t_users where uname=? and pwd=?";
   //创建SQL命令对象
   ps=conn.prepareStatement(sql);
   //给占位符赋值
   ps.setString(1,uname);
   ps.setString(2, pwd);
   //执行SQL命令
   rs=ps.executeQuery();
   //遍历
   while(rs.next()){
    //给变量赋值
    u=new User();
    u.setUid(rs.getInt("uid"));
    u.setUname(rs.getString("uname"));
    u.setPwd(rs.getString("pwd"));
    u.setSex(rs.getString("sex"));
    u.setAge(rs.getInt("age"));
    u.setBirthday(rs.getString("birthday"));
   /* u.setBirthday(rs.getString("birthday"));*/
   }
  } catch (Exception e) {
   e.printStackTrace();
  }finally{//关闭资源
   DBUtil.closeAll(rs, ps, conn);
  }
  //返回结果
  return u;
 }
 @Override
 public int regUserInfo(String uname, String pwd, String sex, int age,
   String birth) {
  String sql="insert into t_users values(default,?,?,?,?,?)";
 DBUtil.executeDML(sql,uname,pwd,sex,age,birth);
  return DBUtil.executeDML(sql,uname,pwd,sex,age,birth);
 }
    

 
}
service层实现类
package com.mt.service.impl;
import com.mt.dao.UserDao;
import com.mt.dao.impl.UserDaoImpl;
import com.mt.pojo.User;
import com.mt.service.UserService;
public class UserServiceImpl implements UserService{
 //创建dao层对象
 UserDao ud=new UserDaoImpl();
 //实现登录功能
 @Override
 public User getUserInfoService(String uname, String pwd) {
  //处理业务数据
  return ud.getUserInfo(uname,pwd);
 }
 @Override
 public int regUserInfoService(String uname, String pwd, String sex,
   int age, String birth) {
  
  return ud.regUserInfo(uname,pwd,sex,age,birth);
 }
 
}
servlet代码:
package com.mt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class OutServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest req, HttpServletResponse rep)
   throws ServletException, IOException {
  //设置请求编码格式
  req.setCharacterEncoding("utf-8");
  //设置响应编码格式
  rep.setContentType("text/html;charset=utf-8");
  //获取请求信息
  //处理请求数据
  HttpSession session = req.getSession();
  session.invalidate();
  //响应处理结果
  //重定向
  rep.sendRedirect("/project/Login.jsp");
  
 }
}
package com.mt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.mt.service.UserService;
import com.mt.service.impl.UserServiceImpl;
public class RegServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest req, HttpServletResponse rep)
   throws ServletException, IOException {
  //设置请求编码格式
  req.setCharacterEncoding("utf-8");
  //设置响应编码格式
  rep.setContentType("text/html;charset=utf-8");
  //获取请求信息
  String uname=req.getParameter("uname");
  System.out.println(uname);
  String pwd=req.getParameter("pwd");
  String sex=req.getParameter("sex");
  System.out.println(sex);
  int age=Integer.parseInt(req.getParameter("age"));
  String birth=req.getParameter("birthday");
  //处理请求数据
  //创建服务层对象
  UserService us=new UserServiceImpl();
  int i=us.regUserInfoService(uname,pwd,sex,age,birth);
  //相应处理结果
  //重定向
    if(i>0){
     //获取session对象
     HttpSession session = req.getSession();
     session.setAttribute("flag", "regsucceed");
     rep.sendRedirect("/pro/Login.jsp");
    }else{
     rep.sendRedirect("/pro/login.jsp");
    }
 }
}
package com.mt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.mt.pojo.User;
import com.mt.service.UserService;
import com.mt.service.impl.UserServiceImpl;

public class UserServlet extends HttpServlet {
 @Override
protected void service(HttpServletRequest req, HttpServletResponse rep)
  throws ServletException, IOException {
         //设置请求编码格式
   req.setCharacterEncoding("utf-8");
   //设置响应编码格式
   rep.setContentType("text/html;charset=utf-8");
   //获取请求信息
   String uname = req.getParameter("uname");
   String pwd = req.getParameter("pwd");
   System.out.println(uname+"---"+pwd);
   //创建业务逻辑层
   UserService us=new UserServiceImpl();
   User u=us.getUserInfoService(uname,pwd);
   //创建session对象
   HttpSession session = req.getSession();
   if(u!=null){
    //存储用户名信息
    session.setAttribute("uname", uname);
    rep.sendRedirect("/project/main.jsp");
   }else{
    //存储登陆失败信息
    session.setAttribute("flag", "loginfalse");
    rep.sendRedirect("/project/Login.jsp");
   }
   
}
}
问题:

因为目前前端每发送一个请求都要求有一个对应的servlet来处理请求,随着项目的扩大,请求也就会越多,如果还是这种的话,就会导致servlet过多,导致资源浪费

解决方案:

利用servlet中service方法来处理,将不同功能的请求封装成方法,由service方法来调用其对应的功能请求方法,利用反射 技术来实现

问题2

因在真实开发过程中,我们一般不会只有一个servlet,一般是一个相似模块对应一个servlet,但对于许多servlet,我们也不能在每个servlet中都声明一下反射代码。

解决方案

向上抽取父类(BaseServlet)

向上抽取父类的实现过程:

第一步:定义BaseServlet并继承HttpServlet,因不想被访问,所以无需在web.xml中配置映射路径,而且要定义有abstract修饰作为抽象类。

第二步:在BaseServlet重写service方法,service方法利用反射来调用我们自己写的方法,

代码:

BaseServler:


package com.mt.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest req, HttpServletResponse rep)
   throws ServletException, IOException {
  //设置请求编码格式
    req.setCharacterEncoding("utf-8");
    
    //设置响应编码格式
    rep.setContentType("text/html;charset=utf-8");
    //获取请求信息
    String methodName=req.getParameter("method");
    //调用处理方法
    try {
     //反射获取方法所在的类对象
     Class cla= this.getClass();
     //有类对象获取执行方法的对象
     Method method = cla.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
     //方法对象执行方法 
     method.invoke(this, req,rep);
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
 }

}

 


 
 
 

 


推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
bw32dts
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有