准备工作:
可能需要的文件:
①(action包)、
其中A文件(是一个接口)的作用就是方便selrvlet调用其实现类的action,里面只有一个方法;
Action.java文件就是action了通过实现A这个接口来完成action的任务;
ForWard.java文件就是一个实现了action工作之后需要跳转的类,里面有两个属性和一个方法(属性:跳转的位置,跳转方式。方法:跳转的方法);
②(dao包)
里面只有一个ObjDao.java,这个类是负责数据库操作的类。主要功能就是用户和数据库的数据交互;
③(servlet包)
ActionServlet.java类是一个负责接收关于action的请求出来的类;
④(config.xml)
而这个文件就比较重要了,它的主要作用就是负责把serlvet和acton连接(告诉servlet具体的请求哪个action);
代码如下:
public class Action implements A{
//实现A接口的方法
@Override
public ForWard test(HttpServletRequest req, HttpServletResponse resp) {
//因为实体类的名字和表保持一致(实体类和表字段保持一致)
Student s=new Student();
//调用ObjDao方法获取表中的所有数据
List<Student> selectAll = ObjDao.selectAll(s);
//将所有数据保存到请求对象中
req.setAttribute("list", selectAll);
//通过跳转类返回给servlet
return new ForWard("NewFile.jsp",true);
}
}
public class ForWard {
//需要跳转的页面名字
private String pageName;
//跳转的方式Request或者Response
private boolean isReq;
public ForWard(String pageName, boolean isReq) {
super();
this.pageName = pageName;
this.isReq = isReq;
}
//跳转的方法通过判断isReq
public void forward(HttpServletRequest req, HttpServletResponse resp){
try {
if (isReq) {
req.getRequestDispatcher(pageName).forward(req, resp);
}else {
resp.sendRedirect(pageName);
}
} catch (ServletException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ObjDao {
//获取Connection方法省...
//关闭资源方法省...
//通过反射写一个查询所有的表(适用大部分表)
public static List selectAll(Object obj){
List list=new ArrayList<>();
Class<? extends Object> c = obj.getClass();
try {
String sql="select * from "+c.getSimpleName();
//获取所有属性
Field[] fields = c.getDeclaredFields();
Field.setAccessible(fields, true);
Connection con = getCon();
PreparedStatement st = con.prepareStatement(sql);
ResultSet rs = st.executeQuery();
while(rs.next()){
//通过类对象实例对象
Object newInstance = c.newInstance();
for (int i = 0; i < fields.length; i++) {
//通过属性的名字取出数据库的只在给属性赋值
fields[i].set(newInstance, rs.getObject(fields[i].getName()));
}
list.add(newInstance);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
public class ActionServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的路径
String uri = req.getRequestURI();
//截取请求路径判断请求action
String name=uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
String path = map.get(name);
try {
//通过全限定名得到类对象
Class<?> forName = Class.forName(path);
//A是所有action的实现接口所以A算是action的父亲
A a = (A)forName.newInstance();
//通过多态思想调用方法,返回调转对象
ForWard test = a.test(req,resp);
//跳转页面
test.forward(req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
//让action都上班(初始所有action的全限定名)
Map<String, String> map=new HashMap<>();
@Override
public void init() throws ServletException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//得到创建 DOM 解析器的工厂。
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
Document document = builder.parse(this.getServletContext().getResourceAsStream("WEB-INF/config.xml")); //得到代表整个文档的 Document 对象
Element e = document.getDocumentElement();
NodeList eList = e.getElementsByTagName("action");
for (int i = 0; i < eList.getLength(); i++) {
Element element = (Element) eList.item(i);
map.put(element.getAttribute("name"), element.getAttribute("class"));
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<!--
name:请求的名字
class:action的全限定名
-->
<action name="action" class="com.xb.action.Action" ></action>
</actions>
<!-- servlet的配置 -->
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>com.xb.serlvet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
最后启动服务查看成果: