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 执行以下主要任务:读取客户端(浏览器)发送的显式的数据。
这包括网页上的 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();
}
}
}
继承类
public class DataServlet extends BaseServlet {
//用户登录
public void userLogin(HttpServletRequest req, HttpServletResponse rep)throws IOException{
System.out.println(“用户登录”);
//获取请求信息
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);
System.out.println(u);
//创建session对象
HttpSession session = req.getSession();
if(u!=null){
//存储用户名信息
session.setAttribute(“uname”, uname);
rep.sendRedirect("/pro2/main.jsp");
}else{
//存储登陆失败信息
session.setAttribute(“flag”, “loginfalse”);
rep.sendRedirect("/pro2/Login.jsp");
}
}
//用户退出
public void userOut(HttpServletRequest req, HttpServletResponse rep) throws IOException{
System.out.println(“用户退出”);
//获取请求信息
//处理请求数据
HttpSession session = req.getSession();
session.invalidate();
//响应处理结果
//重定向
rep.sendRedirect("/pro2/Login.jsp");
}
//用户注册
public void userReg(HttpServletRequest req, HttpServletResponse rep) throws IOException{
System.out.println(“注册用户”);
//获取请求信息
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("/pro2/Login.jsp");
}else{
rep.sendRedirect("/pro2/login.jsp");
}
}
//查询用户信息
public void selUserInfo(HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException{
//获取请求信息
//处理请求数据
//创建业务层对象
UserService us=new UserServiceImpl();
List list=us.selUserInfoService();
//响应处理结果
req.setAttribute(“list”,list);
//请求转发
req.getRequestDispatcher("/user/userList.jsp").forward(req, rep);
}
}