文章目录
  1. 1. service模块:
  2. 2. account-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模块是综合之前三个模块,提供总的服务,直接看代码。

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>


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>


  这个给出其中一个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项目代码)。

文章目录
  1. 1. service模块:
  2. 2. account-web模块: