maven小项目注册服务(三)--web模块

  java的web应用打包方式一般为war它和jar的区别就是包含了更多的资源和文件,如JSP文件,静态资源文件,servlet等等。war包的核心就WEB-INF文件夹下必须有一个web.xml 的配置文件,子目录classes包含所有该项目的类,子目录lib包含所有的依赖,这两个目录都会在运行的时候添加到classpath下。

       maven对于web项目有统一的格式。项目代码和资源还是放在src/main/java和src/main/resources下,web资源目录在src/main/webapp/。webapp下就包含WEB-INF,css, js, jsp,等等文件夹。

       这里account-service模块是综合之前三个模块,提供总的服务,直接看代码:

      SignUpRequest对应表单的信息:

public class SignUpRequest {
	private String id;

    private String email;

    private String name;

    private String password;

    private String confirmPassword;

    private String captchaKey;

    private String captchaValue;

    private String activateServiceUrl;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getConfirmPassword() {
		return confirmPassword;
	}

	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
	}

	public String getCaptchaKey() {
		return captchaKey;
	}

	public void setCaptchaKey(String captchaKey) {
		this.captchaKey = captchaKey;
	}

	public String getCaptchaValue() {
		return captchaValue;
	}

	public void setCaptchaValue(String captchaValue) {
		this.captchaValue = captchaValue;
	}

	public String getActivateServiceUrl() {
		return activateServiceUrl;
	}

	public void setActivateServiceUrl(String activateServiceUrl) {
		this.activateServiceUrl = activateServiceUrl;
	}
}

  接口实现:

public interface AccountService {
	String generateCaptchaKey() throws AccountServiceException;
	byte[] generateCaptchaImage(String captchaKey)
		throws AccountServiceException;
	void signUp(SignUpRequest signUpRequest) throws AccountServiceException;
	void activate(String activationNumber) throws AccountServiceException;
	void login(String id, String password) throws AccountServiceException;
}


public class AccountServiceImpl implements AccountService {
	private AccountPersistService accountPersist;
	private AccountEmailService accountEmail;
	private AccountCaptchaService accountCaptcha;
	private Map<String, String> activationMap = new HashMap<String, String>();
	
	public AccountPersistService getAccountPersist() {
		return accountPersist;
	}
	public void setAccountPersist(AccountPersistService accountPersist) {
		this.accountPersist = accountPersist;
	}
	public AccountEmailService getAccountEmail() {
		return accountEmail;
	}
	public void setAccountEmail(AccountEmailService accountEmail) {
		this.accountEmail = accountEmail;
	}
	public AccountCaptchaService getAccountCaptcha() {
		return accountCaptcha;
	}
	public void setAccountCaptcha(AccountCaptchaService accountCaptcha) {
		this.accountCaptcha = accountCaptcha;
	}
	public String generateCaptchaKey() throws AccountServiceException {
		try {
			return accountCaptcha.generateCaptchaKey();
		} catch (Exception e) {
			throw new AccountServiceException("Unable to generate captcha key",e);
		}

	}
	public byte[] generateCaptchaImage(String captchaKey)
			throws AccountServiceException {
		try {
			return accountCaptcha.generateCaptchaImage(captchaKey);
		} catch (Exception e) {
			throw new AccountServiceException("Unable to generate captcha image",e);
		}
		
	}
	public void signUp(SignUpRequest signUpRequest)
			throws AccountServiceException {
		try 
		{
			if (!signUpRequest.getPassword().equals(signUpRequest.getConfirmPassword())) {
				throw new AccountServiceException("password donnot match");
			}
		
			if (!accountCaptcha.validateCaptcha(signUpRequest.getCaptchaKey(), 
					signUpRequest.getCaptchaValue())) {
				throw new AccountCaptchaException("captcha not match");
			}
			Account account = new Account();
			account.setId(signUpRequest.getId());
			account.setEmail(signUpRequest.getEmail());
			account.setName(signUpRequest.getName());
			account.setPassword(signUpRequest.getPassword());
			account.setActivated(false);
			
			accountPersist.createAccount(account);
			
			String activationId = RandomGenerator.getRandomString();
			activationMap.put(activationId, account.getId());
			String link = signUpRequest.getActivateServiceUrl().endsWith("/") ? 
					signUpRequest.getActivateServiceUrl()+activationId : signUpRequest.getActivateServiceUrl()+
					"?key="+activationId;
			accountEmail.sendMail(account.getEmail(), "please activate Your email", link);
			
		} catch (AccountCaptchaException e) {
			throw new AccountServiceException("unable to validate captcha", e);
		} catch (AccountEmailException e) {
			throw new AccountServiceException("unable to send email", e);
		} catch (AccountPersistException e) {
			throw new AccountServiceException("unable to create account", e);
		}
	}
	public void activate(String activationId)
			throws AccountServiceException {
		String accountId = activationMap.get(activationId);

		if (accountId == null) {
			throw new AccountServiceException("invalid account activated id");
		}
		try {
			Account account = accountPersist.readAccount(accountId);
			account.setActivated(true);
			accountPersist.updateAccount(account);
		} catch (Exception e) {
			throw new AccountServiceException("Unable to activate");
		}
		
	}
	public void login(String id, String password)
			throws AccountServiceException {
		try {
			Account account = accountPersist.readAccount(id);
			if (account == null) {
				throw new AccountServiceException("account donnot exits");
			}
			if (!account.isActivated()) {
				throw new AccountServiceException("account not activate");
			}
			if (!account.getPassword().equals(password)) {
				throw new AccountServiceException("password is error");
			}
		} catch (AccountPersistException e) {
			throw new AccountServiceException("Unable to logging", e);
		}
	}
}

  注意service的配置文件中pom必须将email、captcha、persist这三个模块包含进去,依赖关系:

<dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>account-email</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>account-persist</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>account-captcha</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>com.icegreen</groupId>
      <artifactId>greenmail</artifactId>
      <version>${greenmail.version}</version>
      <scope>test</scope>
    </dependency>

account-web模块:

pom需要依赖servlet,service模块,其他的配置和一般的maven项目一样。

<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>

web.xml:定义了一些servlet,具体的servlet实现代码在src/main/java 下。

<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.hust.silence.account.web.CaptchaImageServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>SignUpServlet</servlet-name>
		<servlet-class>com.hust.silence.account.web.SignUpServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>ActivateServlet</servlet-name>
		<servlet-class>com.hust.silence.account.web.ActivateServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.hust.silence.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>
</web-app>

  这个给出其中一个servlet的代码:对用户login的处理。

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() );
        }
    }
}

  关于jsp界面只有两个:login.jsp和signup.jsp这个对于接触过web 的而言很简单了。

     基本上这些内容大概就可以说明maven的好处和使用方法了,经过书上的讲解和自己的实际操练,对maven的使用会更加熟悉,当然自己用到的只是maven的皮毛,它的功能可 不仅仅只有这些,这些只是它的核心功能。如果能在实际项目中运用,并去学习的话会对maven有更深的了解,鉴于时间关系,我只能先了解个大概,之后若需要的时候能够快速的使用起来,也希望能在实验室项目中好好的使用这个工具。(有机会和时间的话,尝试重构实验室之前的web项目代码)。

 

posted @ 2015-01-12 11:22  silenceer  阅读(560)  评论(0编辑  收藏  举报