思路:
servlet缩减到只有一个。减少了web.xml里面的配置信息。
每次跳转servlet都跳转到一个servlet里面。然后在里面调用业务逻辑的类,然后在跳转到相应的jsp页面。
第一步: 新建一个所有实体类的父类:用父类new 所需的子类
可以提高代码的维护性,增加代码的精简性。
package com.wj.entity;
/**
* 实体类的父类
* @author admin
* @date 2017-5-29 下午02:52:51
* @project_name DIYMVCUpgradeTwo
* @package_name com.wj.entity
*/
public class AllForm {
}
第二步:新建一个登录的实体类:注意命名
后面必须加Form
package com.wj.entity;
/**
* 继承实体类的父类
* @author wj
* @date 2017-5-29 下午02:53:30
* @project_name DIYMVCUpgradeTwo
* @package_name com.wj.entity
*/
public class LoginForm extends AllForm{
private String uname;
private String pwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public LoginForm() {
super();
// TODO Auto-generated constructor stub
}
public LoginForm(String uname, String pwd) {
super();
this.uname = uname;
this.pwd = pwd;
}
@Override
public String toString() {
return "LoginForm [pwd=" + pwd + ", uname=" + uname + "]";
}
}
第三步新建一个总的servlet
package com.wj.servlet;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wj.entity.AllForm;
import com.wj.servletDo.AllServletInterfaceDo;
import com.wj.servletDo.Jump;
public class AllServletDo extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
//初始化properties 对象
Properties properties = new Properties();
//初始化propertiesObject 对象
Properties propertiesObject = new Properties();
//找到项目路径
String url = config.getServletContext().getRealPath("/");
try {
//找到项目路径里面的config.properties 配置文件
InputStream inputStream = new FileInputStream(url+"WEB-INF/config.properties");
//加载文件
properties.load(inputStream);
//存入application
config.getServletContext().setAttribute("properties", properties);
//存入application
config.getServletContext().setAttribute("propertiesObject", propertiesObject);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取配置键名
String url = req.getRequestURI();
url = url.substring(url.lastIndexOf("/")+1, url.lastIndexOf("."));
//获取application 里面的值
Properties properties = (Properties)req.getSession().getServletContext().getAttribute("properties");
Properties propertiesObject = (Properties)req.getSession().getServletContext().getAttribute("propertiesObject");
//根据键名获取权限定名
String key = properties.getProperty(url);
//根据权限定名 获取值
AllServletInterfaceDo allServletInterfaceDo =(AllServletInterfaceDo)properties.get(key);
//如果allServletInterfaceDo是第一次new 为空 则new 一个新的对象 否则不new
if(allServletInterfaceDo == null){
try {
//new 一个对象
allServletInterfaceDo = (AllServletInterfaceDo)Class.forName(key).newInstance();
// 吧对象存入properties
properties.put(key, allServletInterfaceDo);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取实体类的权限定名
String urlForm = url+"Form";
try {
String classForm=properties.getProperty(urlForm);
Class clzz= Class.forName(classForm);
AllForm allForm =(AllForm) clzz.newInstance();
//获取表单的name值
Enumeration enumeration = req.getParameterNames();
while(enumeration.hasMoreElements()){
//获取数组里面name
String pName=(String)enumeration.nextElement();
//根据name获取表单值
String pValue=req.getParameter(pName);
System.out.println("pName :"+pName+" pValue:"+pValue);
//通过反射获取set的方法
String set="set"+pName.substring(0,1).toUpperCase()+pName.substring(1);
System.out.println(set);
Field field = clzz.getDeclaredField(pName);
System.out.println(field.getType().getName().getClass()+" field.getType().getSimpleName().getClass() :"+field.getType().getSimpleName().getClass());
Method method = clzz.getDeclaredMethod(set, field.getType().getSimpleName().getClass());
method.setAccessible(true);
//给实体类赋值
method.invoke(allForm, pValue);
}
Jump jump=allServletInterfaceDo.execute(allForm);
jump.jumpPack(req, resp);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
}
因为这个类里面有些类都没写好,配置也没有配置,所以一开始还是会报错的。
紧接着再新建一个:逻辑层的接口
package com.wj.servletDo;
import com.wj.entity.AllForm;
/**
* 逻辑层的 接口
* @author wj
* @date 2017-5-29 下午02:54:03
* @project_name DIYMVCUpgradeTwo
* @package_name com.wj.servletDo
*/
public interface AllServletInterfaceDo {
public Jump execute(AllForm allForm);
}
然后新建一个登录的逻辑类:
package com.wj.servletDo;
import com.wj.entity.AllForm;
public class LoginDo implements AllServletInterfaceDo{
public Jump execute(AllForm allForm) {
// TODO Auto-generated method stub
System.out.println("这里写业务逻辑");
//表单里面的值都可以用 allForm强转成实体类然后在点出属性就能获得值啦!如下:
LoginForm loginForm = (LoginForm)allForm;
System.out.println("账号为:"+loginForm.getUname()+" 密码为: "+loginForm.getPwd());
return new Jump("index.jsp", true);
}
}
最后还要增加一个专门用来跳转的类
package com.wj.servletDo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 一个跳转jsp页面的类
* @author wj
* @date 2017-5-29 下午02:54:28
* @project_name DIYMVCUpgradeTwo
* @package_name com.wj.servletDo
*/
public class Jump {
private String url;
private boolean flage;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isFlage() {
return flage;
}
public void setFlage(boolean flage) {
this.flage = flage;
}
public Jump() {
super();
// TODO Auto-generated constructor stub
}
public Jump(String url, boolean flage) {
super();
this.url = url;
this.flage = flage;
}
@Override
public String toString() {
return "Jump [flage=" + flage + ", url=" + url + "]";
}
/**
*
* @date 2017-5-29下午02:55:11
* @author wj
* @parameters HttpServletRequest req,HttpServletResponse resp
* @impact 为true重定向 为false请求转发
* @return void
*/
public void jumpPack(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException{
if(flage){
resp.sendRedirect(url);
}else{
req.getRequestDispatcher(url).forward(req, resp);
}
}
}
配置那个总servlet的xml 如下:
<servlet>
<servlet-name>AllServletDo</servlet-name>
<servlet-class>com.wj.servlet.AllServletDo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AllServletDo</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意!!登录的jsp页面一定要和实体类的值要一样大小写都要区分。
<form action="login.do" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="text" name="pwd"><br/>
<input type="submit" value="提交"><br/>
</form>
最后还有一步就是配置啦! 配置文件:config.properties 代码如下
login=com.wj.servletDo.LoginDo
loginForm=com.wj.entity.LoginForm
login:是登录的业务逻辑
loginForm:login的实体类