web项目总结
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项目总结的更多相关文章
- java Web项目创建之一(普通java web项目的创建与发布)
1.创建新的web项目 file->new_>Dynamic Web Project(如图) 或file->new->Project->Web->Dynamic W ...
- ASP.NET MVC开发:Web项目开发必备知识点
最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...
- Velocity笔记--使用Velocity获取动态Web项目名的问题
以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...
- Springboot搭建web项目
最近因为项目需要接触了springboot,然后被其快速零配置的特点惊呆了.关于springboot相关的介绍我就不赘述了,大家自行百度google. 一.pom配置 首先,建立一个maven项目,修 ...
- 一个简单的网站web项目的详解
有不对的术语,或者不好理解的部分,欢迎大家批评指正,谢谢大家! 近期做的网站web项目,实现登录功能,查询功能.首先把这个项目分为几个模块来处理,当前用户模块,历史用户模块,历史记录模块,数据库模块, ...
- 从myeclipse导入eclipse,不能识别为web项目(java项目转为web项目)
1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存: ...
- 【.net深呼吸】非 Web 项目使用缓存
从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并 ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
- IntelliJ IDEA使用(一):创建maven web项目
在公司用eclipse开发maven web项目后,慢慢开始明白大家的那句话"受不了eclipse".的确,在开发大型的web项目,尤其是maven构建的项目,eclipse很不友 ...
- Maven创建web项目:SpringMVC+Mybatis 【转】
IDEA14创建Maven管理的SpringMVC+Mybatis,web项目 项目构建步骤 1.File->New->Project 勾选Create from archetype 点击 ...
随机推荐
- JAVA程序提示错误:需要class,interface或enum解决方法
错误详情: 解决办法:主要是用非记事本编写代码文件,存在编码格式转换问题.重新先建一个记事本程序,然后把源代码粘贴到该文件下,用javac 类名.java编译,java 文件名运行该程序即可
- 调用数据库函数CallableStatement
- EDMA3随笔
最近查DM814x上两个M3莫名其妙挂掉的问题查了将近两周,最后发现居然是各个模块的dma乱用引起的. A8上的音频mcasp用了两个dma通道…… TI给的simcop里面imx实现的swosd又用 ...
- Ajax跨域请求ashx文件与Webservice文件
前台页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...
- JS中window.showModalDialog()详解
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框. window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框. ...
- 倒排索引压缩:改进的PForDelta算法
由于倒排索引文件往往占用巨大的磁盘空间,我们自然想到对数据进行压缩.同时,引进压缩算法后,使得磁盘占用减少,操作系统在query processing过程中磁盘读取效率也能提升.另外,压缩算法不仅要考 ...
- T4:T4 笔记 + Trait 示例
背景 官方教程:http://msdn.microsoft.com/en-us/library/vstudio/bb126445.aspx. 如果开发环境或编译器内置了对模板的支持而没有善加利用,就算 ...
- eclipse导入Android项目后,项目的名称变为了主Activity的名称
不要使用File -> Import -> Android -> Existing Android Code into Workspace,而是用 File -> Import ...
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
- nginx location模块--匹配规则
Location语法语法:location [=|~|~*|^~] /uri/ { … } = --> 开头表示精确匹配 ^~ --> 开头表示uri以某个常规字符串开头,理解为匹配url ...