记录一下老师留的servlet小练习,顺便总结一下servlet的知识
先说一下编码问题啊,在这个小作业中遇到的最大的障碍,通过两天的各种百度,终于得以解决,开心!!!!!
首先是数据库的编码有问题,导致我直接把语句写死了,最后输出的变量也是有问号,像这样
想到应该是数据库编码问题
解决方法
1.数据库编码设为
utf_unicode_ci
2.连接数据库的编码设为UTF-8
String url = "jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=UTF-8";
解决了数据库编码问题之后,我就从前端传参数过来,但是传过来的参数打印到控制台居然是问号,然后又各种设置eclipse编码,参考博客http://blog.csdn.net/rzleilei/article/details/10019527
但是还是???
后来发现原来是我把tomcat的编码设置成UTF-8了,然后再用上
String inter =new String(request.getParameter("interesting").getBytes("ISO-8859-1"),"UTF-8");
当然就会转码出错了
最后我把tomcat的编码URLencoding=UTF-8删除,终于就成功了!
一、题目:
各小组将小组成员信息建表team_member,记录成员的学号,姓名,出生日期,兴趣爱好等信息。
编写一个简单查询界面,用户输入兴趣爱好的关键字,查出相应小组成员,交给jsp页面显示
目录结构
二。注意的地方:
1、jdbc加到WEB-INF的lib目录下
2.、 编码问题:
dopost请求方式加上 request.setCharacterEncoding("utf-8");
这都是百度的方法,然而还是乱码,还在不断尝试中。。。而且用乱码过滤器也不行,泪奔
解决如上
三、代码
Dao 用来连接数据库
public class Dao {
public static Connection getConnection() throws SQLException
{
String url = "jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=UTF-8";
String username = "huihui";
String password = "123456";
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username, password);
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet rs,PreparedStatement ps,Connection conn) throws SQLException
{
try
{
rs.close();
ps.close();
conn.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
Search.java 用来查询数据库
public class Search {
public static List<String> getIdByInterest(String inter) throws SQLException {
List<String> re=new ArrayList<String>();
String student_Id="";
String name="";
Date birth_date = null;
try {
Connection conn = Dao.getConnection();
System.out.println(inter);
String sql="select * from team_member where inter like ?";
System.out.println(sql);
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "%"+inter+"%");
System.out.println(ps.toString());
ResultSet rs = ps.executeQuery();
while (rs.next()) {
student_Id = rs.getString("num");
name=rs.getString("name");
birth_date=rs.getDate("birth_date");
String inte=rs.getString("inter");
re.add(student_Id);
re.add(name);
re.add(birth_date.toString());
re.add(inte);
}
Dao.close(rs, ps, conn);
} catch (SQLException e) {
e.printStackTrace();
}
return re;
}
}
SearchByInterest.java这个servlet将数据传给jsp
package com.search;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.Search;
/**
* Servlet implementation class SearchByInterest
*/
@WebServlet("/SearchByInterest")
public class SearchByInterest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SearchByInterest() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
String inter =new String(request.getParameter("interesting").getBytes("ISO-8859-1"),"UTF-8");
List <String>re=new ArrayList<String>();
try
{
re = Search.getIdByInterest(inter);
request.setAttribute("information", re.toString());
}
catch(SQLException e)
{
System.out.println("数据库出现异常");
e.printStackTrace();
}
request.getRequestDispatcher("/WEB-INF/Result.jsp").forward(request, response);
}
}
四、总结
为什么用PreparedStatement而不是Statement,第一是为了代码的可读性
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
用
?代替变量,这样可读性更好,不容易出错。第二是能够提高性能,使用PreparedStatment能够在预编译中缓存下来,这样经常调用的查询语句的查询速度会更快,而Statement每次都要重新查询,就比较慢了。第三是提高了安全性。
2.doGet和doPost请求区别
安全性:
doGet不如doPost安全,因为它的参数显示在浏览器上,所以安全性更差
传输文件大小:
doGet传输文件一般小于2kb,而doPost不受此限制
效率:
doGet效率更高
3.sservlet的生命周期
1)初始化阶段init()
在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
2)响应客户端请求
它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3)销毁阶段
仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
1.Tomcat和servlet的工作步骤
2.web client向servlet容器发送http请求
3.servlet容器响应请求
4.servlet创建一个HttpRequest对象,把请求封装到对象中
5.servlet创建HttpResponse对象
6.servlet调用HttpServlet的service方法,把两个对象作为参数装到service中
7.HttpServlet调用HttpRequest来获得http请求
8.HttpServlet调用HttpResponse响应消息
9.Servlet把HttpServlet的相应结果传给client
servlet部分参考博客http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html
网友评论