web项目 Webroot下面的index.jsp页面的内容:

<%@ page language="java" pageEncoding="UTF-8"%>
<%
response.sendRedirect("start.do");
%> <!--在index.jsp中使用 start.do 跳转到 /WEB-INF/jsp/user_login.jsp 受保护资源 -->
Web.xml中定义监听器
<listener>
<listener-class>
net.wanggd.mobile_scm.web.SysInit
</listener-class>
</listener> net.wanggd.mobile_scm.web.SysInit是监听类,当weblogic或tomcat启动的时候加载 package net.wanggd.mobile_scm.web;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SysInit implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext application = event.getServletContext();
//系统名称
String sysname = application.getInitParameter("sysname");
application.setAttribute("sysname", sysname);
//全局上下文路径
application.setAttribute("ctx", application.getContextPath());
}
} 需要实现2个方法 在user_login.jsp中有
<head>
<title>${sysname}</title>
<!—
sysname就是在监听器net.wanggd.mobile_scm.web.SysInit中定义的全局上下文 -->
</head>
验证码
Jsp页面验证码的显示和更换
<div class="validateCodeDiv" style="cursor:pointer;display:none" onclick="changeCode();">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="60">
请求验证码,使用servlet构建的,src指定访问servlet的地址
<img src="servlet/getVcode" id="imgVcode"/>
</td>
</tr>
<tr>
<td align="center" valign="middle" height="20" style="color:blue">若看不清,点图片换一张
</td>
</tr>
</table>
</div> 验证码之servlet代码

package net.wanggd.mobile_scm.web; import java.io.IOException;
import java.io.OutputStream; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.beifeng.mobile_scm.utils.VCodeGenerator; public class GetValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = 8244305529216943035L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { OutputStream os = response.getOutputStream();
VCodeGenerator vg = new VCodeGenerator(os);
String vcode = vg.drawCode();
os.close();
//把验证码放入session中
request.getSession().setAttribute("vcode", vcode);
} } 验证码核心实现类
package net.wanggd.mobile_scm.utils; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; import javax.imageio.ImageIO; public class VCodeGenerator { final private char[] chars = "2345678ABCDEFGHJKLMPQRSTUVWXYabcdefhkmnqrstuvwx"
.toCharArray();
private static String[] fontNames = new String[] { "Courier", "Arial",
"Verdana", "Georgia", "Times", "Tahoma" };
private static int[] fontStyle = new int[] { Font.PLAIN, Font.BOLD,
Font.ITALIC, Font.BOLD | Font.ITALIC }; private int width = 160;
private int height = 60;
private int charCnt = 4;
private int disturbLineNum = 10; private OutputStream os; public VCodeGenerator(OutputStream os) {
this.os = os;
} public VCodeGenerator(OutputStream os, int width, int height, int charCnt) {
this.width = width;
this.height = height;
this.charCnt = charCnt;
this.os = os;
} public String drawCode() throws IOException {
BufferedImage bi = new BufferedImage(this.width, this.height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setColor(new Color(245, 245, 245));
g.fillRect(0, 0, this.width, this.height); drawDisturbLine(g); BufferedImage[] bis = new BufferedImage[charCnt];
char[] codes = generateCode();
for (int i = 0; i < charCnt; i++) {
bis[i] = generateBuffImg(codes[i]);
g.drawImage(bis[i], null, (int) (this.height * 0.7) * i, 0);
} g.dispose(); ImageIO.write(bi, "gif", os);
return new String(codes);
} private BufferedImage generateBuffImg(char c) {
String tmp = Character.toString(c);
Color forecolor = getRandomColor();
Color backcolor = new Color(255, 255, 255, 0);
String fontName = getRandomFontName();
int fontStyle = getRandomStyle();
int fontSize = getRandomSize();
int strX = (this.height - fontSize) / 2;
int strY = (this.height - fontSize) / 2 + fontSize;
double arch = getRandomArch(); BufferedImage ret = new BufferedImage(this.height, this.height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = ret.createGraphics();
g.setColor(backcolor);
g.fillRect(0, 0, this.height, this.height); g.setColor(forecolor);
g.setFont(new Font(fontName, fontStyle, fontSize));
g.rotate(arch, this.height / 2, this.height / 2);
g.drawString(tmp, strX, strY); g.dispose();
return ret;
} private double getRandomArch() {
return ((int) (Math.random() * 1000) % 2 == 0 ? -1 : 1) * Math.random();
} private Color getRandomColor() {
int r = (int) (Math.random() * 10000) % 200;
int g = (int) (Math.random() * 10000) % 200;
int b = (int) (Math.random() * 10000) % 200;
return new Color(r, g, b);
} private String getRandomFontName() {
int pos = (int) (Math.random() * 10000) % (fontNames.length);
return fontNames[pos];
} private int getRandomStyle() {
int pos = (int) (Math.random() * 10000) % (fontStyle.length);
return fontStyle[pos];
} private int getRandomSize() {
int max = (int) (this.height * 0.98);
int min = (int) (this.height * 0.75);
return (int) (Math.random() * 10000) % (max - min + 1) + min;
} private char[] generateCode() {
char[] ret = new char[charCnt];
for (int i = 0; i < charCnt; i++) {
int letterPos = (int) (Math.random() * 10000) % (chars.length);
ret[i] = chars[letterPos];
}
return ret;
} private void drawDisturbLine(Graphics2D graphics) {
for (int i = 0; i < disturbLineNum; i++) {
graphics.setColor(getRandomColor());
int x = (int) (Math.random() * 10000) % (this.width + 1) + 1;
int x1 = (int) (Math.random() * 10000) % (this.width + 1) + 1;
int y = (int) (Math.random() * 10000) % (this.height + 1) + 1;
int y1 = (int) (Math.random() * 10000) % (this.height + 1) + 1;
graphics.drawLine(x, y, x1, y1);
} } public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("d:/tmp.gif");
VCodeGenerator vg = new VCodeGenerator(fos);
vg.drawCode();
}
}
Js函数
使用jquery指定id为magVcode的img元素的src,这是使用了参数ts=new date().getTime()防止页面缓存导致验证码不变 function changeCode() {
$("#imgVcode").attr("src", "servlet/getVcode?ts=" + new Date().getTime());
} 定义外部的js user_login.js
文件的内容 如下(注意这里没有<script></script>) function changeCode() {
$("#imgVcode").attr("src", "servlet/getVcode?ts=" + new Date().getTime());
} 在jsp页面中引入外部js
<head>
<script type="text/javascript" src="js/user_login.js"></script>
</head>
Jquey链式编程
Jquery为单个元素指定事件处理方式 //处理提交按纽图片
$("#submitBtn").mouseover(function(){
this.src = "images/login_submitBtn2.gif";
}).mouseout(function(){
this.src = "images/login_submitBtn1.gif";
}).click(function() {
submitForm();//自定义函数
}); Jquery为多个元素一起指定事件处理方式
$("input[name=account], input[name=passwd], #submitBtn").click(function(){
$("div.validateCodeDiv").css("display", "none");
}).focus(function() {
$("div.validateCodeDiv").css("display", "none");
}); Jquey获取表单元素的一种方式,使用name 属性
function submitForm() {
var oAcc = $("input[name=account]");
if(oAcc.val().trim().length == 0) {
$("#messBox").html("请输入用户名");
oAcc.focus();
return;
}
var oPass = $("input[name=passwd]");
if(oPass.val().trim().length == 0) {
$("#messBox").html("请输入密码");
oPass.focus();
return;
}
var oVcode = $("input[name=vcode]");
if(oVcode.val().trim().length == 0) {
$("#messBox").html("请输入验证码");
oVcode.focus();
return;
} var url = "userLogin.do";
//自定义表单的数据序列化
//var para = getFormPara($("form[name=frm1]"));
使用jquey的函数获取表单数据的集合
var para = $("form[name=frm1]").serialize();
注意下面要使用$.post,不要使用$.get(会出现中文乱码)

$.post(url, para, function(data) {
if (data == "vcode error") {
$("#messBox").html("验证码错误");
} else if (data == "userpass error") {
$("#messBox").html("用户名或密码错误");
} else {
location = "home.do";
} changeCode(); //立即再改变验证码
});
} 对注册页面进行修改,测试jquery的serialize()获取表单的数据,
这里用到了
$.post(url, para, function(data) {}) 修改后的Jsp的页面截图

使用下面的js代码测试
var para = $("form[name=frm1]").serialize();
alert(para);
弹出的内容转码了,但是在action中显示的还是中文,
可能是在web.xml中配置的字符编码过滤器起了作用
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> Java代码,当jquey的$.post方法提交到下面的action时,各属性会使用jquey传过来的参数赋值
public class UserLoginAction implements ServletResponseAware { private String account;
private String passwd;
private String vcode;
private String sex;
private String address;
private String introduction;
处理ajax的请求的java代码
Struts2的action中获取session
Map<String, Object> session = ActionContext.getContext().getSession();
PrintWriter out = response.getWriter();
//从session中获取验证码
String realVcode = (String) session.get("vcode");
if (!realVcode.equalsIgnoreCase(vcode)) {
out.print("vcode error"); //返回ajax的请求的数据
out.close();
return null; //返回null,不指定result
} if (!userLoginService.validateUser(account, passwd)) {
out.print("userpass error");
out.close();
return null; //返回null,不指定result
} //将用户信息放入SESSION
session.remove("vcode");
session.put("loginUser", "张三");
session.put("skin", "default"); out.print("success");
out.close();
return null; //返回null,不指定result }
断点跟踪java代码,中文也正确的显示 经过测试发现,<input>标签中的text radio,以及<select> 、<textarea>使用serialize()方法,都会正确的获取表单的结合 js获得元素的绝对位置
function getAbsPosition(o){
把传进来的对象,(不论是dom对象还是jquey对象都可以)转为jquey对象
o = $(o);
if (o.length == 0) {
return false;
}
再重新转换为dom对象
o = o[0]; var left, top;
left = o.offsetLeft;
top = o.offsetTop; while (o = o.offsetParent) {
left += o.offsetLeft;
top += o.offsetTop;
} return {
left: left,
top: top
};
} 自定义js的函数

String.prototype.trim = function(){
return this.replace(/(^\s*)|(\s*$)/g, "");
};
String.prototype.startWith = function(str){
if (typeof(str) === "undefined") {
return false;
}
str = str.toString();
if (this.substr(0, str.length) == str) {
return true;
} else {
return false;
}
} String.prototype.endWith = function(otherStr){
if (typeof(otherStr) === "undefined") {
return false;
}
otherStr = otherStr.toString();
var startPos = this.length - otherStr.length;
if (startPos >= 0) {
var tmp = this.substr(startPos);
if (tmp === otherStr) {
return true;
} else {
return false;
}
} else {
return false;
}
} String.prototype.contains = function(otherStr){
if (typeof(otherStr) === "undefined") {
return false;
}
if (this.indexOf(otherStr.toString()) == -1) {
return false;
} else {
return true;
}

web项目总结的更多相关文章

  1. java Web项目创建之一(普通java web项目的创建与发布)

    1.创建新的web项目 file->new_>Dynamic Web Project(如图) 或file->new->Project->Web->Dynamic W ...

  2. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

  3. Velocity笔记--使用Velocity获取动态Web项目名的问题

    以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...

  4. Springboot搭建web项目

    最近因为项目需要接触了springboot,然后被其快速零配置的特点惊呆了.关于springboot相关的介绍我就不赘述了,大家自行百度google. 一.pom配置 首先,建立一个maven项目,修 ...

  5. 一个简单的网站web项目的详解

    有不对的术语,或者不好理解的部分,欢迎大家批评指正,谢谢大家! 近期做的网站web项目,实现登录功能,查询功能.首先把这个项目分为几个模块来处理,当前用户模块,历史用户模块,历史记录模块,数据库模块, ...

  6. 从myeclipse导入eclipse,不能识别为web项目(java项目转为web项目)

    1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存:         ...

  7. 【.net深呼吸】非 Web 项目使用缓存

    从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并 ...

  8. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  9. IntelliJ IDEA使用(一):创建maven web项目

    在公司用eclipse开发maven web项目后,慢慢开始明白大家的那句话"受不了eclipse".的确,在开发大型的web项目,尤其是maven构建的项目,eclipse很不友 ...

  10. Maven创建web项目:SpringMVC+Mybatis 【转】

    IDEA14创建Maven管理的SpringMVC+Mybatis,web项目 项目构建步骤 1.File->New->Project 勾选Create from archetype 点击 ...

随机推荐

  1. 不用ide编译java程序时调用jar包

    调用特定目录下的jar包 javac -cp d:\javatest\dom4j.jar Dom4jDemo.java //这部分必须注意,d:\javatest 是Dom4jDemo.class所在 ...

  2. Linux内核分析之计算机是如何工作的

    一.计算机工作原理 本周实验主要是反汇编C代码,生成汇编程序.冯·诺依曼理论的要点是:数字计算机的数制采用二进制,计算机应该按照程序顺序执行.人们把冯·诺依曼的这个理论称为冯·诺依曼体系结构.CPU通 ...

  3. 2015年8月18日,杨学明老师《技术部门的绩效管理提升(研讨会)》在中国科学院下属机构CNNIC成功举办!

    2015年8月18日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<技术部门的绩效管理提升(研讨会)>培训课程.杨学明老师分别从研发绩效管理概述.研发绩 ...

  4. line-height,vertical-align及图片居中对齐问题根源解析

    关于图片居中对齐的问题,进入前端行业虽然有一段时间了,以为自己懂了,可是实际上还是一知半解,找了一些博客来看了一下,但是感觉讲的有点碎,看完还是一知半解. 查阅了一下<css权威指南>,结 ...

  5. jeesite笔记

    环境 Github上的不能初始化数据库:https://github.com/thinkgem/jeesite 官网上的可以: http://jeesite.com/ 用 Idea 打开,修改 \sr ...

  6. Android UI开发【开篇导航】

    如今移动互联网正处于飞速发展的时期,正式看中这个行业的发展势头,本人在2011年从.NET转行做了移动应用开发这块,接触了android和ios开发,到今已快3个年头,先前忙于学习各种基础知识和语法方 ...

  7. AngularJS快速入门指南01:导言

    AngularJS使用新的attributes扩展了HTML AngularJS对单页面应用的支持非常好(SPAs) AngularJS非常容易学习 现在就开始学习AngularJS吧! 关于本指南 ...

  8. centos基本操作

    yum install nodejs npm install -g shadowsocks nohup ssserver & 后台运行 vi /usr/lib/node_modules/sha ...

  9. apache 虚拟主机的配置

    一.基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [root@localhost root]# ifconfig et ...

  10. 修改Android签名证书keystore的密码、别名alias以及别名密码

    Eclipse ADT的Custom debug keystore自定义调试证书的时候,Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指 ...