当前位置: 代码迷 >> Web前端 >> Maven account-web事例
  详细解决方案

Maven account-web事例

热度:1360   发布时间:2013-07-09 09:50:47.0
Maven account-web例子

1.新建Maven Module项目account-web,父项目选中account,生成后,account项目的Pom文件内容为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.iteye.xujava</groupId>
	<artifactId>account</artifactId>
	<version>1.0.0</version>
	<packaging>pom</packaging>
	<name>Account</name>

	<modules>
		<module>account-email</module>
		<module>account-persist</module>
		<module>account-captcha</module>
		<module>account-service</module>
		<module>account-web</module>
	</modules>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<springframework.version>2.5.6</springframework.version>
		<junit.version>4.9</junit.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context-support</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-web</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<configuration>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-resources-plugin</artifactId>
					<configuration>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

?

account-web项目内容的Pom文件内容为:

?

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.iteye.xujava</groupId>
		<artifactId>account</artifactId>
		<version>1.0.0</version>
	</parent>
	<artifactId>account-web</artifactId>
	<name>Account Web</name>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>account-service</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
	</dependencies>
</project>

?

2.在src/main/java的com.iteye.xujava.account.web的包下新建以下4个文件

package com.iteye.xujava.account.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.iteye.xujava.account.service.AccountService;
import com.iteye.xujava.account.service.AccountServiceException;

public class ActivateServlet extends HttpServlet {
	private static final long serialVersionUID = 3668445055149826106L;

	private ApplicationContext context;

	@Override
	public void init() throws ServletException {
		super.init();
		context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String key = req.getParameter("key");

		if (key == null || key.length() == 0) {
			resp.sendError(400, "No activation key provided.");
			return;
		}

		AccountService service = (AccountService) context.getBean("accountService");

		try {
			service.activate(key);
			resp.getWriter().write("Account is activated, now you can login.");
		} catch (AccountServiceException e) {
			resp.sendError(400, "Unable to activate account");
			return;
		}
	}
}

?

package com.iteye.xujava.account.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 org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.iteye.xujava.account.service.AccountService;
import com.iteye.xujava.account.service.AccountServiceException;

public class CaptchaImageServlet extends HttpServlet {
	private ApplicationContext context;

	private static final long serialVersionUID = 5274323889605521606L;

	@Override
	public void init() throws ServletException {
		super.init();
		context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String key = request.getParameter("key");

		if (key == null || key.length() == 0) {
			response.sendError(400, "No Captcha Key Found");
		} else {
			AccountService service = (AccountService) context.getBean("accountService");

			try {
				response.setContentType("image/jpeg");
				OutputStream out = response.getOutputStream();
				out.write(service.generateCaptchaImage(key));
				out.close();
			} catch (AccountServiceException e) {
				response.sendError(400, e.getMessage());
			}
		}
	}
}

?

package com.iteye.xujava.account.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.iteye.xujava.account.service.AccountService;
import com.iteye.xujava.account.service.AccountServiceException;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 929160785365121624L;

	private ApplicationContext context;

	@Override
	public void init() throws ServletException {
		super.init();
		context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String id = req.getParameter("id");
		String password = req.getParameter("password");

		if (id == null || id.length() == 0 || password == null || password.length() == 0) {
			resp.sendError(400, "incomplete parameter");
			return;
		}

		AccountService service = (AccountService) context.getBean("accountService");

		try {
			service.login(id, password);
			resp.getWriter().print("Login Successful!");
		} catch (AccountServiceException e) {
			resp.sendError(400, e.getMessage());
		}
	}
}

?

package com.iteye.xujava.account.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.iteye.xujava.account.service.AccountService;
import com.iteye.xujava.account.service.AccountServiceException;
import com.iteye.xujava.account.service.SignUpRequest;

public class SignUpServlet extends HttpServlet {
	private static final long serialVersionUID = 4784742296013868199L;

	private ApplicationContext context;

	@Override
	public void init() throws ServletException {
		super.init();
		context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String id = req.getParameter("id");
		String email = req.getParameter("email");
		String name = req.getParameter("name");
		String password = req.getParameter("password");
		String confirmPassword = req.getParameter("confirm_password");
		String captchaKey = req.getParameter("captcha_key");
		String captchaValue = req.getParameter("captcha_value");

		if (id == null || id.length() == 0 || email == null || email.length() == 0 || name == null || name.length() == 0 || password == null
				|| password.length() == 0 || confirmPassword == null || confirmPassword.length() == 0 || captchaKey == null
				|| captchaKey.length() == 0 || captchaValue == null || captchaValue.length() == 0) {
			resp.sendError(400, "Parameter Incomplete.");
			return;
		}

		AccountService service = (AccountService) context.getBean("accountService");

		SignUpRequest request = new SignUpRequest();

		request.setId(id);
		request.setEmail(email);
		request.setName(name);
		request.setPassword(password);
		request.setConfirmPassword(confirmPassword);
		request.setCaptchaKey(captchaKey);
		request.setCaptchaValue(captchaValue);

		request.setActivateServiceUrl(getServletContext().getRealPath("/") + "activate");

		try {
			service.signUp(request);
			resp.getWriter().print("Account is created, please check your mail box for activation link.");
		} catch (AccountServiceException e) {
			resp.sendError(400, e.getMessage());
			return;
		}
	}
}

?

3.?新建src/main/webapp源码目录,在目录下新建login.jsp和signup.jsp,新建WEB-INF,在其下新建web.xml.

xml内容为:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>Sample Maven Project: Account Service</display-name>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:/account-persist.xml
			classpath:/account-captcha.xml
			classpath:/account-email.xml
			classpath:/account-service.xml
		</param-value>
	</context-param>
	<servlet>
		<servlet-name>CaptchaImageServlet</servlet-name>
		<servlet-class>com.iteye.xujava.account.web.CaptchaImageServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>SignUpServlet</servlet-name>
		<servlet-class>com.iteye.xujava.account.web.SignUpServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>ActivateServlet</servlet-name>
		<servlet-class>com.iteye.xujava.account.web.ActivateServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.iteye.xujava.account.web.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>CaptchaImageServlet</servlet-name>
		<url-pattern>/captcha_image</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>SignUpServlet</servlet-name>
		<url-pattern>/signup</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>ActivateServlet</servlet-name>
		<url-pattern>/activate</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>signup.jsp</welcome-file>
	</welcome-file-list>
</web-app>

?

login.jsp内容为:

<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<style type="text/css">

.text-field {position: absolute; left: 40%; background-color:rgb(255,230,220);}
label {display: inline-table; width: 90px; margin: 0px 0px 10px 20px; }
input {display: inline-table; width: 150px; margin: 0px 20px 10px 0px;}
h2 {margin: 20px 20px 20px 40px;} 
button {margin: 20px 20px 10px 110px}      
</style>
</head>
<body>

<div class="text-field">

<h2>账户登录</h2>
<form name="login" action="login" method="post">
<label>账户ID:</label><input type="text" name="id"></input><br/>
<label>密码:</label><input type="password" name="password"></input><br/>
<button>确认并提交</button>
</form>
</div>

</body>
</html>

?

signup.jsp内容如下:

<%@ page contentType="text/html; charset=gb2312" language="java" %>
<%@ page import="com.iteye.xujava.account.service.*,
  org.springframework.context.ApplicationContext,
  org.springframework.web.context.support.WebApplicationContextUtils"%>
<html>
<head>
<style type="text/css">

.text-field {position: absolute; left: 40%; background-color:rgb(255,230,220);}
label {display: inline-table; width: 90px; margin: 0px 0px 10px 20px; }
input {display: inline-table; width: 150px; margin: 0px 20px 10px 0px;}
img {width:150px; margin: 0px 20px 10px 110px;}
h2 {margin: 20px 20px 20px 40px;} 
button {margin: 20px 20px 10px 110px}      
</style>
</head>
<body>

<%
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext( getServletContext() );
AccountService accountervice = (AccountService) context.getBean( "accountService" );
String captchaKey = accountervice.generateCaptchaKey();
%>

<div class="text-field">

<h2>注册新账户</h2>
<form name="signup" action="signup" method="post">
<label>账户ID:</label><input type="text" name="id"></input><br/>
<label>Email:</label><input type="text" name="email"></input><br/>
<label>显示名称:</label><input type="text" name="name"></input><br/>
<label>密码:</label><input type="password" name="password"></input><br/>
<label>确认密码:</label><input type="password" name="confirm_password"></input><br/>
<label>验证码:</label><input type="text" name="captcha_value"></input><br/>
<input type="hidden" name="captcha_key" value="<%=captchaKey%>"/>
<img src="<%=request.getContextPath()%>/captcha_image?key=<%=captchaKey%>"/>
</br>
<button>确认并提交</button>
</form>
</div>

</body>
</html>

?

4.在src/main/resources目录下新建service.properties文件,内容如下,此处要写正确邮箱,否则测试无法通过:

email.protocol=smtp
email.host=smtp.163.com
email.port=25
email.username=test@163.com
email.password=password
email.auth=true
email.systemEmail=test@163.com

persist.file=E:/mavenspace/account/target/test-classes/persist-data.xml

?

5.测试:

在account-web项目的POM内容中添加plugin:

	<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.mortbay.jetty</groupId>
					<artifactId>jetty-maven-plugin</artifactId>
					<version>7.1.0.RC1</version>
					<configuration>
						<scanIntervalSeconds>10</scanIntervalSeconds>
						<webAppConfig>
							<contextPath>/account</contextPath>
						</webAppConfig>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

?

在.m2/中的setting.xml文件中的

<pluginGroups>中增加以下内容:

<pluginGroup>org.mortbay.jetty</pluginGroup>

?就可以直接使用mvn jetty:run部署并启动Jetty。

或输入:

mvn jetty:run -Djetty.port=9999改变端口

?

6.输入:http://localhost:8080/account/signup.jsp进行注册,注册完后会发送邮件到你输入的邮箱,发送到邮箱的链接不正确,正确格式类似于:http://localhost:8080/account/activate?key=hhhjdfbm。

输入链接激活后,就可以输入http://localhost:8080/account/login.jsp登录了。

?

7.自动部署cargo-maven2-plugin

7.1本地部署

standalone模式:Cargo会从Web容器的安装目录复制一份配置到用户指定的目录,每次重新构建的时候,这个目录会被清空

<plugin>
					<groupId>org.codehaus.cargo</groupId>
					<artifactId>cargo-maven2-plugin</artifactId>
					<version>1.0</version>
					<configuration>
						<container>
							<containerId>tomcat6x</containerId>
							<home>D:\dev\tomcat\6035frame</home>
						</container>
						<configuration>
							<type>standalone</type>
							<home>${project.build.directory}/tomcat6x</home>
						</configuration>
					</configuration>
				</plugin>

?这样生成的访问路径为:http://localhost:8080/account-web-1.0.0/,

要设置finalName,即:

?

<build>
		<finalName>account</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.mortbay.jetty</groupId>
					<artifactId>jetty-maven-plugin</artifactId>
					<version>7.1.0.RC1</version>
					<configuration>
						<scanIntervalSeconds>10</scanIntervalSeconds>
						<webAppConfig>
							<contextPath>/account</contextPath>
						</webAppConfig>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.codehaus.cargo</groupId>
					<artifactId>cargo-maven2-plugin</artifactId>
					<version>1.0</version>
					<configuration>
						<container>
							<containerId>tomcat6x</containerId>
							<home>D:\dev\tomcat\6035frame</home>
						</container>
						<configuration>
							<type>standalone</type>
							<home>${project.build.directory}/tomcat6x</home>
						</configuration>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

?访问路径为:http://localhost:8080/account/,

配置完成后,运行mvn clean install,再运行mvn cargo:start启动服务器.cargo会把Tomcat中的文件复制到account-web/target/tomcat6x下,再将项目部署到tomcat6x下的webapps中。

运行mvn cargo:stop停止服务器。

?

eisting模式:用户要指定现有Web容器配置目录,Cargo会直接使用这些配置并将应用部署到其对应的位置

?

<plugin>
					<groupId>org.codehaus.cargo</groupId>
					<artifactId>cargo-maven2-plugin</artifactId>
					<version>1.0</version>
					<configuration>
						<container>
							<containerId>tomcat6x</containerId>
							<home>D:\dev\tomcat\6035frame</home>
						</container>
						<configuration>
							<type>existing</type>
							<home>D:\dev\tomcat\6035frame</home>
						</configuration>
					</configuration>
				</plugin>

?

配置完成后,运行mvn clean install,再运行mvn cargo:start启动服务器.cargo会把项目部署到指定的Tomcat下的webapps中。

运行mvn cargo:stop停止服务器。

?

7.2远程部署(未测试)

?

<plugin>
	<groupId>org.codehaus.cargo</groupId>
	<artifactId>cargo-maven2-plugin</artifactId>
	<version>1.0</version>
	<configuration>
		<container>
			<containerId>tomcat6x</containerId>
			<type>remote</type>
		</container>
		<configuration>
			<type>runtime</type>
			<properties>
				<cargo.remote.username>username</cargo.remote.username>
				<cargo.remote.password>password</cargo.remote.password>
				<cargo.tomcat.manager.url>http://localhost:8080/manager</cargo.tomcat.manager.url>
			</properties>
		</configuration>
	</configuration>
</plugin>

?运行命令:mvn cargo:redeploy部署

进一步了解,可访问http://cargo.codehaus.org/Maven2+plugin