学习jsp和servle整合

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表单,指定actionmethodaction是将数据提交給servletmethod是数据提交的方式为post

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

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

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

用户退出:

 

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

 

第二步:我们点击退出登录按钮,超链接向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();
    }
    
 }
}

 

 
 
 

 

posted on 2019-07-12 14:50  马涛AA  阅读(299)  评论(0编辑  收藏  举报

导航