servlet入门

一.Servlet简介

1.什么是Servlet:

一个运行在WEB服务器上的小的Java程序(写Servlet就相当于写一个java程序),用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
Servlet就是SUN公司提供的一个动态网页开发技术
response,request

2.Servlet的作用:

先获得客户端浏览器发送的请求,做一些相应的处理,最后将请求处理的结果响应给浏览器

3.servlet运行原理

总结:Servlet作为补充Web服务器功能的组件,需要依赖于Servlet容器才能运行
过程:浏览器通过输入的IP地址和端口号来找到相对于的web服务器——
如果请求的是静态资源,就直接找到对应的html页面,返回给浏览器——
如果请求的是动态资源,web服务器的通信模块接收请求,将请求进一步传输给Servlet容器,Servlet容器负责创建Servlet实例,并且将请求的数据解析出来,解析出来之后Servlet容器再传给Servlet,在Servlet真正处理完数据之后,响应结果也是由Servlet容器的通信模板负责返回给web服务器端的,web服务器再将servlet返回的结果返回给浏览器,后续的servlet的管理和销毁也是由servlet容器来处理的。
在这里插入图片描述

4.servlet容器

Tomcat,weblogic等,这些servlet容器不仅仅具有管理servlet的功能,也具备了web服务器的功能,所以安装一个tomcat就可以具备servlet容器和web服务器的双重功能。

二.Servlet生命周期

1.阶段

Servlet生命周期的四个阶段的执行时机
阶段一:实例化调用Servlet的构造器创建一个具体的Servlet对象的过程
阶段二:初始化在初始化阶段, init ( )方法会被调用
阶段三:就绪Servlet被初始化后就处于能够响应请求的就绪状态, service(req,res)
阶段四:销毁Servlet容器停止或者重新启动都会引起销毁Servlet对象的动作destroy()

2.HttpServlet抽象类
1111
3.在java中如何编写Servlet

①.File–>New–>Web Project(servlet)

②.创建web包–>New–>Servlet–>LifeServlet.java,会自动实现Servlet接口或继承HttpServlet抽象类,覆盖service方法,再选中init()and destroy()方法。

package web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LifeServlet extends HttpServlet {
	//实例化,空的构造函数
	public LifeServlet() {
		System.out.println("第一阶段——实例化");
	}
	//初始化
	public void init() throws ServletException {
		System.out.println("第二阶段——初始化");
	}
	//就绪
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1)throws ServletException, IOException {
		System.out.println("第三阶段——就绪");
	}
	//销毁
	public void destroy() {
		System.out.println("第四阶段——销毁");
	}
}

③.WebRoot–>WEB-INF–>web.xml下配置servlet信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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-app_2_5.xsd">
  <!--servlet配置-->
  <servlet>
  	<!--servlet的名称,随便起的-->
   	<servlet-name>LifeServlet</servlet-name>
   	<!--servlet的全路径,.-->
    <servlet-class>web.LifeServlet</servlet-class>
  </servlet>
  <!--servlet的映射-->
  <servlet-mapping>
  	<!--servlet的名称,对应上面servlet配置中的名称,大小写也要一致-->
    <servlet-name>LifeServlet</servlet-name>
    <!--servlet的具体访问路径-->
    <url-pattern>/life</url-pattern>
  </servlet-mapping>
</web-app>

④.部署项目到Tomcat中,每次修改servlet文件时要重新部署项目,修改web.xml会自动更新,不需要重新部署
Window–>Show View–>Servers
右击你的Tomcat 7.x–>Add Demployment–>选择Project–>Finish
解决每次修改servlet文件时都要重新部署项目的问题?
在tomcat安装目录下–>conf–>contect.xml–>设置<Context reloadable="true"> <Context >

⑤.启动tomcat
右击你的Tomcat7.x–>Run servers

⑥.访问项目
在浏览器中输入http://localhost:8080/项目名/servlet的具体访问路径,例如:http://localhost:8080/servlet/life。
第一次访问之后会直接调用生命周期的前三个阶段,第二次访问就只调用第三个阶段就绪

⑦.移除项目
右击servlet项目–>Remove Demployment
会调用最后一个销毁阶段。

4.web.xml的load-on-startup配置
<load-on-startup>1</load-on-startup>,配置在<servlet><servlet>标签中

作用:设置servlet是何时创建的
在web.xml中设置多个servlet,可使用load-on-startup指定servlet加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

值:
设置>=0,说明servlet会在服务器启动之前被创建
即在服务器启动之前先执行一二阶段,在第一次浏览器访问时,servlet响应web请求,只调用第三阶段。
设置<=0或者不设置,说明servlet是在被浏览器解读的时候创建
即第一次用浏览器访问时会直接调用一二三阶段,之后再访问只调用第三阶段。
设置正数的值越小,启动servlet的优先级越高,时机越早

好处:
在开发web应用时,都会配置这个参数
1.如果初始化过程失败,容器会提示启动失败,我们能够提前知道相关错误。
2.相当于将初始化servlet的工作转移到容器启动,使得容器只要启动成功后,就可立即响应web请求。

5.web.xml的url-pattern配置

1.完全路径匹配:以/开始,例如: /life,/aaa/life,/aaa/bb/life
<url-pattern>/aa/life</url-pattern>可以通过http://localhost:8080/servlet/aa/life访问
2.目录匹配/通配符匹配:以/开始,以*结束,*代表匹配0个或多个字符,例如:/*,/aaa/*,/aaa/b/*
<url-pattern>/aa/*</url-pattern>通过http://localhost:8080/servlet/aa/a(abc)(写不写都可访问)
<url-pattern>/aa/bbb/*</url-pattern>通过http://localhost:8080/servlet/aa/bbb/a(随意,可不写)来访问
3.后缀匹配:*.任意后缀目录匹配和后缀匹配不能混合使用,即不能以/开始
<url-pattern>*.do</url-pattern>通过http://localhost:8080/servlet/aa.do访问
<url-pattern>*.action</url-pattern>通过http://localhost:8080/servlet/.action访问
<url-pattern>/.do</url-pattern> <url-pattern>/aaa/bbb/.do</url-pattern>是不正确的
4.完全路径匹配>目录匹配>后缀匹配

6.web.xml的init-param

<init-param></init-param>配置初始化参数
<param-name></param-name>配置初始化参数名
<param-value></param-value>配置初始化参数值
<load-on-startup>必须放在<init-param>后

四.ServletConfig对象

1.作用:获得servlet配置信息
2.java中获得ServletConfig对象:ServletConfig cfg = getServletConfig();
3.java中获取init-param参数值
①.String getServletName();–获得Servlet在web.xml中配置的name的值。
②.String getInitParameter(String name);–获得Servlet的初始化参数的。
③.Enumeration getInitParameterNames();—获得所有Servlet的初始化参数的名称。
④.String getServletContexto();–获得servletContext对象

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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-app_2_5.xsd">
  <!--servlet配置-->
  <servlet>
  	<!--servlet的名称,随便起的-->
   	<servlet-name>LifeServlet</servlet-name>
   	<!--servlet的全路径,.-->
    <servlet-class>web.LifeServlet</servlet-class>
  	<!--设置初始化参数,可以同时设置多个参数值-->
  	<init-param>
  		<!--初始化参数的参数名-->
  		<param-name>company</param-name>
  		<param-value>keystone</param-value>
  		<!--初始化参数的参数值-->
  	</init-param>
  	<init-param>
  		<param-name>address</param-name>
  		<param-value>zz</param-value>
  	</init-param>
  	<!--设置servlet创建时期-->
  	<load-on-startup>1</load-on-startup>
  	<!---->
  </servlet>
  <!--servlet的映射-->
  <servlet-mapping>
  	<!--servlet的名称,对应上面servlet配置中的名称,大小写也要一致-->
    <servlet-name>LifeServlet</servlet-name>
    <!--servlet的具体访问路径-->
    <!--<url-pattern>/aa/life</url-pattern>-->
    <!--<url-pattern>/aa/ *</url-pattern>-->
    <url-pattern>*.bb</url-pattern>
  </servlet-mapping>
</web-app>
package web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LifeServlet extends HttpServlet {
	//实例化
	public LifeServlet() {
		System.out.println("第一阶段——实例化");
	}
	//初始化
	public void init() throws ServletException {
		System.out.println("第二阶段——初始化");
	}
	//就绪
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1)throws ServletException, IOException {
		System.out.println("第三阶段——就绪");
		//获得servletConfig对象,从而获取初始化参数
		ServletConfig config = getServletConfig();
		String company = config.getInitParameter("company");
		String address = config.getInitParameter("address");
		System.out.println("company:"+company+"  address:"+address);
	}
	//销毁
	public void destroy() {
		System.out.println("第四阶段——销毁");
	}
}

五.ServletRequest对象

1.子类

httpServletRequest对象:浏览器发起请求,httpServletRequest对象接收参数,提交数据到服务器端

2.ServletRequest接收参数

String getParameter(String name);用于接收一个名称对应一个值的数据.
String getParameterValues(String name);用于接收一个名称对应多个值的数据.
Map getParameterMap();于接收表单中的所有的数据,Map的key是表单提交的参数名称Map的value是提交参数的值.
Enumeration getParameterNamesO–用于获取表单中提交的所有的参数的名称

3.请求方式

get请求:在地址栏输入一个地址,超链接,表单的默认提交方式也是get请求.
post请求:将表单的Method属性设置为post时,浏览器会发送post请求
get和post的区别:
get的提交的参数会显示到地址栏上,而post不显示.
get往往是有大小限制的,而post没有大小的限制.
get没有请求体而post有请求体

六.ServletResponse对象

1.子类

httpServletResponse对象:服务器端接收完请求,返回数据给客户端,给客户端做出响应

2.setContentType()作用

①.通知容器,在调用out.println方法输出时,使用指定的字符集生成一个消息头( content-type) ,通知浏览器,服务器返回的数据类型和字符集

3.如何做出响应

获得输出流:PrintWriter out = response.getWriter();
发送数据:out.println( “html代码”);

4.乱码问题

产生原因:客户端编码与服务器端解码不一致
解决:
服务器端:request.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=utf-8”);
客户端: <meta http-equiv= “content-type” content="text/html;charset=“utf-8”>

5.过程

在WebRoot下创建一个form.html来测试get和post请求,在浏览器输入http://localhost:8080/servlet/form.html
输入姓名和爱好,点提交,姓名和爱好会被提交到地址栏上,f12,Headers,Status Code(状态码):200是成功,404是资源不存在,500是服务器内部出现错误,302是重定向,304是查找本地缓存,响应头,请求头,请求参数,post请求多了一个Content-type,用于解决编码问题

<!DOCTYPE html>
<html>
  <head>
    <title>form.html</title>
    //解决客户端乱码
    <meta http-equiv= "content-type" content="text/html;charset=utf-8">
  </head>
  <body>
  	<!--action设置为hello是提交路径,创建的servlet文件的访问路径就是/hello,提取姓名,爱好等数据到达HelloServlet.java中,HelloServlet是将提取的数据用request收集了一些数据并做出了输出-->
    <form action="hello" method="get/post">
    	姓名:<input type="text" name="username">
    	爱好:购物<input type="checkbox" name="habit" value="shopping"/>
    		钓鱼<input type="checkbox" name="habit" value="fishing"/>
    		游泳<input type="checkbox" name="habit" value="swiming"/><br/>
    	<input type="submit" value="提交">
    </form>
  </body>
</html>

在src的web包下创建一个servlet文件HelloServlet.java,不用写init和destory方法,还是继承.HttpServlet抽象类,点Next,将Servlet/JSP Mapping URL直接改成访问路径/hello,即web.xml的url-pattern,会直接在web.xml下生成servlet配置和servlet映射。

package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//解决服务器端访问时的乱码问题,以utf-8来接收客户端数据
		request.setCharacterEncoding("utf-8");
		//根据参数名来获取参数值
		String username = request.getParameter("username");
		System.out.println(username);
		//根据参数名获取一组参数值
		String[] habits = request.getParameterValues("habit");
		for(String habit:habits){
			System.out.println(habit);
		}
		//接收表单所有的键值对参数
		Map<String, String[]> map = request.getParameterMap();
		Set<Entry<String, String[]>> entrySet = map.entrySet();
		for(Entry<String,String[]> entry:entrySet){
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
		//解决服务器端返回一个页面时的乱码问题
		response.setContentType("text/html;charset=utf-8");
		//将获得的数据以输出流的形式用html页面响应给客户端(浏览器端)
		PrintWriter out = response.getWriter();
		out.println("<h1>"+"hello:"+username+"</h1>");
		//重定向到LifeServlet中,LiseServlet的url-pattern地址是/life
		//response.sendRedirect("life");
		//跳转到index.jsp中
		//response.sendRedirect("index.jsp");
		//跳转到百度中
		response.sendRedirect("http://baidu.com");	
	}
}
  <!--servlet配置-->
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>web.HelloServlet</servlet-class>
  </servlet>
  <!--servlet的映射-->
    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

七.ServletContext对象

代表当前web应用,是一个全局的环境变量。
该应用中的任何组件,在任何时候都可以访问到该对象,所以Servlet上下文具有唯一性

1.作用范围:

整个web工程.

2.创建:

服务器启动的时候,tomcat服务器为每个web项目创建一个单独 ServletContext对象

3.销毁:

服务器关闭的时候,或者项目从服务器中移除的时候.

4.ServletContext的作用:

1.用来获得全局初始化参数: String getInitParameter(String name);
2.用来获得上下文路径: String getContextPath();
3.作为域对象存取数据: setAttribute(String,Object) getAttribute(String)
4.用来读取web项目下的资源文件: String getRealPath(String path);

5.如何获得ServletContext对象

ServletContext sctx = getServletContext();
1.通过GenericServlet提供的getServletContext() ;
2.通过ServletConfig提供的getServletContext();
3.通过HttpSession提供的getServletContext() ;
4.通过FilterConfig提供的getServletContext()

6.全局初始化参数

<context-param>
	<param-name>account</param-name>
	<param-value>1000</param-value>
<context-param>

7.例子

创建AccountServlet.java的servlet文件使用servletContext对象记录浏览量

package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AccountServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//创建servletContext对象
		ServletContext context = getServletContext();
		//从作用域中获得值
		Integer account=(Integer)context.getAttribute("account");
		//判断account是否存在,若不存在说明是第一次访问servlet,就设置account为1
		if(account==null){
			//account= 1;
			//获得全局初始化参数
			String init = context.getInitParameter("account");
			int initaccount = Integer.parseInt(init);
			account=initaccount;
		}else{
			account++;
		}
		//将最新的访问量设置到servletContext对象的作用域中
		context.setAttribute("account", account);
		//使用response响应数据到浏览器
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<h1>访问量"+account+"</h1>");
		//关闭流
		out.close();
	}
}

在web.xml下加上以下数据

<!--设置全局servlet的初始化参数-->
<context-param>
	<param-name>account</param-name>
	<param-value>1000</param-value>
</context-param>
<!--设置AccountServlet.java的URL时自动生成的-->
<servlet>
    <servlet-name>AccountServlet</servlet-name>
    <servlet-class>web.AccountServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AccountServlet</servlet-name>
    <url-pattern>/account</url-pattern>
</servlet-mapping>

八.Servlet与jdbc

1.使用jdbc访问数据库步骤

①.将JDBC驱动jar包和dbcp连接池jar包放到WEB-INF\lib下
原因: ClassLoader找到字节码文件,然后加载到JVM的方法区中,变成一个对象。Tomcat都有自己的类加载器,会去WEB-INF下面lib中找字节码文件。毕竟jar包中都是字节码文件。
②.编写JDBC代码,需要注意异常的处理

九.合并多个servlet

通过request.getRequestURI()方法获取请求资源路径
可以将所有操作请求处理合并到一个Servlet中,实现请求的分发
String action = uri.substring(uri.lastIndexOf( “/” )+ 1,uri.lastIndexOf( " . "));
修改web.xml

<servlet-mapping>
	<servlet-name>actionServlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

sql语句,创建emp员工表,在src下创建sql包,创建文件emp.sql

create database mybase1;
create table emp(
	id int(4) primary key auto_increment,
	name varchar(20),
	salary double(7,2),
	age int(3)
);
insert into emp values(1,'zs',7000.0,22);
insert into emp values(2,'ls',8000.0,24);

emp实体类,src下创建enity包,创建emp.java类

package enity;

public class Emp {
	private Integer id;
	private String name;
	private Double salary;
	private Integer age;
	//添加set,get方法
	//添加有参构造函数
	//添加无参构造函数
	//重写toString方法
}

Jdbc连接池,src下创建conf包(存配置文件),创建dbcp.properties文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/mybase1
username=root
password=root123
initialSize=10
maxActive=50
maxId=20
minId=5
maxWait=60000
connectionProperties=useUnicode\=true;characterEncoding\=utf-8
defaultAutoCommit=true
defaultTransactionlsolation=READ_COMMITTED

处理结果集,在src下创建rowmapper包,创建RowMapper接口,再创建RowMapperImpl继承类

package rowmapper;

import java.sql.ResultSet;
public interface RowMapper<T> {
	//处理结果集
	public T mapperRow(ResultSet rs);
}
package rowmapper;

import java.sql.ResultSet;
import enity.Emp;

public class RowMapperImpl implements RowMapper {
	//处理结果集,并封装成对象
	@Override
	public Emp mapperRow(ResultSet rs) {
		Emp emp=new Emp();
		try {
			emp.setId(rs.getInt(1));
			emp.setName(rs.getString(2));
			emp.setSalary(rs.getDouble(3));
			emp.setAge(rs.getInt(4));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return emp;
	}
}

封装jdbc加载驱动获取连接,src下创建util包(装工具类),创建JdbcUtil类

package util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

public class JdbcUtil {
	static DataSource pool=null;
	static Properties pro=new Properties();
	private static ThreadLocal<Connection> tdl=new ThreadLocal<Connection>();
	static{
		InputStream is=null;
		try {
			is = JdbcUtil.class.getResourceAsStream("/conf/dbcp.properties");
			pro.load(is);
			pool=BasicDataSourceFactory.createDataSource(pro);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public static Connection getConnection() throws Exception{
		Connection conn = tdl.get();
		if(conn==null){
			conn=pool.getConnection();
			tdl.set(conn);
		}
		return conn;
	}
	public static void release(ResultSet rs,PreparedStatement pstm,Connection conn) throws Exception{
		if(rs!=null) rs.close();
		if(pstm!=null) pstm.close();
		if(conn!=null){
			conn.close();
			tdl.remove();
		}
	}
}

封装jdbc增删改查操作,src下创建util包(装工具类),创建JdbcTemplate类

package util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import rowmapper.RowMapper;

public class JdbcTemplate<T> {
	Connection conn = null;
	PreparedStatement pstm =null;
	ResultSet rs=null;
	//查询一条结果
	public T queryForObject(String sql,RowMapper<T> rm,Object...args){
		T t=null;
		try {
			conn = JdbcUtil.getConnection();
			pstm = conn.prepareStatement(sql);
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			rs = pstm.executeQuery();
			if(rs.next()){
				t=rm.mapperRow(rs);
			}
		} catch (Exception e) {
			System.out.println("JdbcTemplate1数据库连接出现异常");
		}finally{
			try {
				JdbcUtil.release(rs, pstm, conn);
			} catch (Exception e) {
				System.out.println("JdbcTemplate1释放资源出现异常");
			}
		}
		return t;
	}
	//查询多条结果
	public List<T> queryForList(String sql,RowMapper<T> rm,Object...args){
		List<T> list=null;
		try {
			conn = JdbcUtil.getConnection();
			pstm = conn.prepareStatement(sql);
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			rs = pstm.executeQuery();
			list=new ArrayList();
			while(rs.next()){
				T t=rm.mapperRow(rs);
				list.add(t);
			}
		} catch (Exception e) {
			System.out.println("JdbcTemplate2数据库连接出现异常");
		}finally{
			try {
				JdbcUtil.release(rs, pstm, conn);
			} catch (Exception e) {
				System.out.println("JdbcTemplate2释放资源出现异常");
			}
		}
		return list;
		
	}
	
	//增删改操作
	//如果sql是完整的就不需要有参数,若sql是半成品args.length!=0则需要有参数,Object...args,是可变长参数,可以理解为数组,可以没有参数,也可以有一个两个三个参数
	public void update(String sql,Object...args){
		try {
			conn =JdbcUtil.getConnection();
			pstm = conn.prepareStatement(sql);
			if(args.length!=0){
				for(int i=0;i<args.length;i++){
					pstm.setObject(i+1, args[i]);
				}
			}
			pstm.executeUpdate();
		} catch (Exception e) {
			System.out.println("JdbcTemplate3数据库发生异常");
		}finally{
			try {
				JdbcUtil.release(null, pstm, conn);
			} catch (Exception e) {
				System.out.println("JdbcTemplate3释放资源出现异常");
			}
		}
	}
}

真正的直接来操作数据库,src下创建dao包,创建EmpDao接口,再创建EmpDaoIMpl实现类

package dao;

import java.util.List;
import enity.Emp;

public interface EmpDao {
	//查询所有员工信息
	public List<Emp> queryEmpAll();
	//添加员工信息
	public void addEmp(Emp emp);
	//根据想要修改的id,查询原有的信息
	public Emp queryEmpById(int id);
	//修改员工信息
	public void updateEmp(Emp emp);
	//通过id删除员工信息
	public void deleteEmp(int id);
}
package dao;

import java.util.List;
import rowmapper.RowMapperImpl;
import util.JdbcTemplate;
import enity.Emp;

public class EmpDaoImpl implements EmpDao {
	JdbcTemplate template=new JdbcTemplate();
	//查询所有员工信息
	@Override
	public List<Emp> queryEmpAll() {
		List<Emp> list = template.queryForList("select * from emp", new RowMapperImpl());
		return list;
	}
	//添加员工信息
	@Override
	public void addEmp(Emp emp) {
		template.update("insert into emp(id,name,salary,age) values(?,?,?,?)", emp.getId(),emp.getName(),emp.getSalary(),emp.getAge());
	}
	//根据想要修改的id,查询原有的信息
	@Override
	public Emp queryEmpById(int id) {
		Emp emp = (Emp)template.queryForObject("select * from emp where id=?", new RowMapperImpl(), id);
		return emp;
	}
	//修改员工信息
	@Override
	public void updateEmp(Emp emp) {
		template.update("update emp set name=?,salary=?,age=? where id=?", emp.getName(),emp.getSalary(),emp.getAge(),emp.getId());
	}
	//通过id删除员工信息
	@Override
	public void deleteEmp(int id) {
		template.update("delete from emp where id=?", id);
	}
	
}

WebRoot下创建addEmp.html用来写添加员工信息的页面

<!DOCTYPE html>
<html>
  <head>
    <title>addEmp.html</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8">
  </head>
  <body style="font-size:30px;text-align:center">
    <h1>添加员工</h1>
    <form method="post" action="addEmp.do">
    	姓名:<input type="text" name="name"/><br/>
    	薪水:<input type="text" name="salary"/><br/>
    	年龄:<input type="text" name="age"/><br/>
    	<input type="submit" value="提交">
    </form>
  </body>
</html>

真正实现jdbc与Servlet结合使用,src下创建web包,在创建ActionServlet的Servlet文件
怎样创建Servlet文件(不是类,虽然后缀都是.java),右击包–>New–>Other–>搜索Servlet

package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmpDao;
import dao.EmpDaoImpl;
import enity.Emp;

public class ActionServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		EmpDao empDao=new EmpDaoImpl();
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//获取请求资源路径ems1/addEmp.do
		String url=request.getRequestURI();
		//切分URL地址,保留addEmp
		String uri=url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));
		if(uri.equals("queryEmp")){
			//查询所有员工记录
			List<Emp> list=empDao.queryEmpAll();
			out.println("<table border='1' width='60%' cellspacing='0' cellpadding='0' align='center'>");
			out.println("<tr><td>ID</td><td>姓名</td><td>薪水</td><td>年龄</td><td>操作</td></tr>");
			for(Emp emp:list){
				out.println("<tr>");
				out.println("<td>"+emp.getId()+"</td>");
				out.println("<td>"+emp.getName()+"</td>");
				out.println("<td>"+emp.getSalary()+"</td>");
				out.println("<td>"+emp.getAge()+"</td>");
				//根据id删除员工
				out.println("<td><a href='deleteEmp.do?id="+emp.getId()+"' οnclick=\"return confirm('是否确定删除"+emp.getName()+"')\">删除</a>");
				out.println("&nbsp;&nbsp;");
				//根据id跳转到修改页面
				out.println("<a href='loadEmp.do?id="+emp.getId()+"'>修改</a></td>");
				out.println("</tr>");
			}
			out.println("</table>");
			out.println("<br/><br/>");
			//点击添加员工的超链接就直接跳转到addEmp.html的页面中,_blank打开一个新的网页
			out.println("<div style='text-align:center'><a href='addEmp.html' target='_blank'>添加员工</a></div>");
		}else if(uri.equals("loadEmp")){
			//根据id查询员工信息
			String id = request.getParameter("id");
			Emp emp=empDao.queryEmpById(Integer.parseInt(id));
			//将员工信息回显到一个修改表单页面
			out.println("<form method='post' action='updateEmp.do'>");
			out.println("<input type='hidden' name='id' value='"+emp.getId()+"'/>");
			out.println("<input type='text' name='name' value='"+emp.getName()+"'/><br/>");
			out.println("<input type='text' name='salary' value='"+emp.getSalary()+"'/><br/>");
			out.println("<input type='text' name='age' value='"+emp.getAge()+"'/><br/>");
			out.println("<input type='submit' value='提交'/>");
			out.println("</form>");
		}else if(uri.equals("updateEmp")){
			//修改
			//获得修改后的Emp信息
			String id=request.getParameter("id");
			String name = request.getParameter("name");
			String salary = request.getParameter("salary");
			String age = request.getParameter("age");
			Emp emp=new Emp(Integer.parseInt(id),name,Double.parseDouble(salary),Integer.parseInt(age));
			//修改用户信息
			empDao.updateEmp(emp);
			//修改成功后重定向到查询所有员工
			response.sendRedirect("queryEmp.do");
		}else if(uri.equals("addEmp")){
			//添加
			String name = request.getParameter("name");
			String salary=request.getParameter("salary");
			String age = request.getParameter("age");
			Emp emp=new Emp(null,name,Double.parseDouble(salary),Integer.parseInt(age));
			empDao.addEmp(emp);
			//添加成功,重定向到queryEmp
			response.sendRedirect("queryEmp.do");
		}else if(uri.equals("deleteEmp")){
			//通过id删除员工
			String id=request.getParameter("id");
			empDao.deleteEmp(Integer.parseInt(id));
			//删除成功后重定向到查询所有员工
			response.sendRedirect("queryEmp.do");
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值