表单提交
前端登录一般会有一个表单,填写个人信息及验证码,(前端校验),点击登录,请求Servlet,完成后端检验,登陆成功。
Servlet中接收表单数据,如果数据条数较多,可以使用request.getParameterMap()方法将数据封装到一个map中,并且还可以封装成一个javaBean对象,可以传到dao层进行查询校验。
//接受表单数据
Map<String, String[]> map = request.getParameterMap();
//把map中的数据映射到user对象中
//方法一,使用CommonUtils工具方法
User user = CommonUtils.toBean(map, User.class);
//方法二,BeanUtils工具方法
//User user = new User();
//BeanUtils.populate(user, map);
使用Servlet
实际应用中,往往一个Servlet里有多个方法,前端可以通过传入method参数,在servlet中进行判断,选取合适的方法。
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 得到请求参数method,判断当前是什么操作
String method = request.getParameter("method");
if ("login".equals(method)) {
login(request, response);
} else if ("regist".equals(method)) {
regist(request, response);
} else if ("logout".equals(method)) {
logout(request, response);
} else if ("activeuser".equals(method)) {
activecode(request, response);
}
}
public void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
//。。等等
}
这样是比较麻烦的,所以可以使用Java反射自定义一个Servlet,来完成判断并执行方法、返回视图的工作。
public class BaseServlet extends HttpServlet {
/*
* 它会根据请求中的m,来决定调用本类的哪个方法
*/
protected void service(HttpServletRequest request , HttpServletResponse response )
throws ServletException, IOException {
request .setCharacterEncoding("UTF-8");
response .setContentType("text/html;charset=utf-8");
// 例如:http://localhost:8080/demo1/xxx?method=login
String methodName = request .getParameter("method");// 它是一个方法名称
// 当没用指定要调用的方法时,那么默认请求的是execute()方法。
if(methodName == null || methodName.isEmpty()) {
methodName = "execute";
}
//反射
Class c = this.getClass();
try {
// 通过方法名称获取方法的反射对象
Method m = c.getMethod(methodName, HttpServletRequest.class,
HttpServletResponse.class);
// 反射方法目标方法,也就是说,如果methodName为add,那么就调用add方法。
String result = (String) m.invoke(this, request , response);
// 通过返回值完成请求转发
if(result != null && !result.isEmpty()) {
request.getRequestDispatcher(result).forward(request , response);
}
} catch (Exception e) {
throw new ServletException(e);
}
}
}
后台处理请求的Servlet继承这个BaseServlet,不用每次去重新写判断语句,而且可以直接返回视图名称进行页面跳转。
使用SpringMVC
SpringMVC底层对Servlet进行了封装,简化了开发,体现在表单登录上的是对于参数的接收的简化,可以直接在Controller中的方法中直接接收。
/**
* 使用User对象接收表单数据,要求input框name属性和User的属性名一致(底层使用反射进行赋值)
*/
@RequestMapping("login")
@ResponseBody
public Result login(User user, String vcode){
}
/**
* 直接使用字符串进行接收
*/
@RequestMapping("login")
@ResponseBody
public Result login(String username, String password, String vcode){
}
验证码
前端代码
<tr>
<td></td>
<td>
<div id="divVerifyCode"><img id="imgVerifyCode" src="UserServlet?method=getVerifyCode"/></div>
</td>
<td>
<label id="changeLable"><a href="javascript:_hyz()">换一张</a></label>
</td>
</tr>
ps:换一张的请求中的路径必须添加动态参数(时间),因为相同的url请求浏览器不会重复发送,而换验证码就是重复请求的过程。
function _hyz(){
document.getElementById("imgVerifyCode").src ="UserServlet?method=getVerifyCode&" + new Date().getTime();
}
Servlet代码
public void getVerifyCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
VCodeUtils vc = new VCodeUtils();
try {
//保存图片并输出到页面
vc.saveImage(vc.getImage(), response.getOutputStream());
String sb = vc.getText();
request.getSession().setAttribute("Vcode", sb);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
持续更新~